153 lines
5.3 KiB
TeX
153 lines
5.3 KiB
TeX
\documentclass[12pt,a4paper]{article}
|
|
\usepackage[utf8]{inputenc}
|
|
\usepackage[T1]{fontenc}
|
|
\usepackage[english]{babel}
|
|
\usepackage{geometry}
|
|
\geometry{margin=2.5cm}
|
|
\usepackage{xcolor}
|
|
\usepackage{tcolorbox}
|
|
\usepackage{booktabs}
|
|
\usepackage{hyperref}
|
|
\usepackage{listings}
|
|
|
|
\definecolor{seblue}{rgb}{0.0,0.28,0.67}
|
|
\definecolor{backcolour}{rgb}{0.95,0.95,0.92}
|
|
|
|
\lstdefinestyle{json}{
|
|
backgroundcolor=\color{backcolour},
|
|
basicstyle=\ttfamily\small,
|
|
breaklines=true,
|
|
showstringspaces=false,
|
|
tabsize=2
|
|
}
|
|
|
|
\title{\textcolor{seblue}{Exercise 2: Bank Account Transaction Processor}\\[0.3em]
|
|
\large AISE501 -- AI in Software Engineering I}
|
|
\author{Dr.\ Florian Herzog}
|
|
\date{Spring Semester 2026}
|
|
|
|
\begin{document}
|
|
\maketitle
|
|
|
|
\section{Use Case}
|
|
|
|
A simple bank system maintains a set of customer accounts, each with a balance, currency, and status (\texttt{active} or \texttt{frozen}).
|
|
A series of transactions is submitted for processing.
|
|
The program must validate each transaction, apply valid ones, reject invalid ones, and produce output files recording the results.
|
|
|
|
\section{Input Files}
|
|
|
|
\subsection{Account State (\texttt{accounts.json})}
|
|
|
|
A JSON file containing an array of account objects:
|
|
|
|
\begin{lstlisting}[style=json]
|
|
{
|
|
"accounts": [
|
|
{
|
|
"account_id": "ACC-001",
|
|
"holder": "Alice Mueller",
|
|
"balance": 5000.00,
|
|
"currency": "CHF",
|
|
"status": "active"
|
|
},
|
|
...
|
|
]
|
|
}
|
|
\end{lstlisting}
|
|
|
|
\subsection{Transactions (\texttt{transactions.json})}
|
|
|
|
A JSON file containing an array of transaction objects.
|
|
Each transaction has a \texttt{type} (\texttt{deposit}, \texttt{withdrawal}, or \texttt{transfer}), an \texttt{account\_id}, an \texttt{amount}, and a \texttt{description}.
|
|
Transfers additionally have a \texttt{to\_account\_id}.
|
|
|
|
\section{Validation Rules}
|
|
|
|
A transaction is \textbf{rejected} if any of these conditions apply:
|
|
|
|
\begin{center}
|
|
\begin{tabular}{ll}
|
|
\toprule
|
|
\textbf{Condition} & \textbf{Applies to} \\
|
|
\midrule
|
|
Account ID does not exist & All types \\
|
|
Account status is not \texttt{active} & All types \\
|
|
Amount is zero or negative & All types \\
|
|
Balance is less than withdrawal amount & Withdrawal, Transfer \\
|
|
Target account does not exist & Transfer \\
|
|
Target account is not \texttt{active} & Transfer \\
|
|
Unknown transaction type & -- \\
|
|
\bottomrule
|
|
\end{tabular}
|
|
\end{center}
|
|
|
|
\section{Output}
|
|
|
|
The program produces:
|
|
|
|
\begin{enumerate}
|
|
\item \textbf{Console output} -- A summary of updated account balances, accepted transactions, and rejected transactions with reasons.
|
|
\item \textbf{Updated account state} (\texttt{accounts\_updated.json}) -- The accounts JSON with balances modified by accepted transactions.
|
|
\item \textbf{Transaction log} (\texttt{transaction\_log.json}) -- Two arrays: \texttt{accepted} and \texttt{rejected}, each transaction annotated with its \texttt{status} and (for rejections) a \texttt{reason}.
|
|
\end{enumerate}
|
|
|
|
\section{Expected Results}
|
|
|
|
Given the provided input files, the expected outcome is:
|
|
|
|
\begin{center}
|
|
\small
|
|
\begin{tabular}{lllp{5cm}}
|
|
\toprule
|
|
\textbf{TXN ID} & \textbf{Type} & \textbf{Result} & \textbf{Reason (if rejected)} \\
|
|
\midrule
|
|
TXN-001 & deposit & Accepted & -- \\
|
|
TXN-002 & withdrawal & Accepted & -- \\
|
|
TXN-003 & withdrawal & Rejected & Insufficient funds \\
|
|
TXN-004 & deposit & Rejected & Negative amount \\
|
|
TXN-005 & deposit & Rejected & Account is frozen \\
|
|
TXN-006 & transfer & Accepted & -- \\
|
|
TXN-007 & withdrawal & Rejected & Account not found \\
|
|
TXN-008 & deposit & Rejected & Zero amount \\
|
|
\bottomrule
|
|
\end{tabular}
|
|
\end{center}
|
|
|
|
\section{Exercise}
|
|
|
|
Two implementations are provided:
|
|
|
|
\begin{enumerate}
|
|
\item \textbf{\texttt{bank\_bad.py}} -- A working but poorly written version that violates many clean code and PEP\,8 principles.
|
|
\item \textbf{\texttt{bank\_good.py}} -- A clean, well-structured version following PEP\,8 and clean code best practices.
|
|
\end{enumerate}
|
|
|
|
\subsection*{Tasks}
|
|
|
|
\begin{enumerate}
|
|
\item Run both programs and verify they produce the same results.
|
|
\item Read the bad version and list all clean code / PEP\,8 violations you can find.
|
|
\item For each violation, explain which principle is broken and why it makes the code harder to read or maintain.
|
|
\item Compare your list with the good version to see how each issue was resolved.
|
|
\end{enumerate}
|
|
|
|
\subsection*{Violations to Look For}
|
|
|
|
\begin{itemize}
|
|
\item Unused imports (\texttt{sys}, \texttt{os}, \texttt{copy}, \texttt{datetime})
|
|
\item No docstrings or module documentation
|
|
\item Single-letter and abbreviated variable names (\texttt{a}, \texttt{t}, \texttt{d}, \texttt{tp}, \texttt{tid})
|
|
\item Multiple statements per line (semicolons)
|
|
\item No whitespace around operators and after commas
|
|
\item Manual file open/close instead of context managers (\texttt{with})
|
|
\item One giant function doing all validation (violates Single Responsibility)
|
|
\item Duplicated validation logic for deposit/transfer amount checks
|
|
\item No constants for file paths
|
|
\item Missing \texttt{if \_\_name\_\_ == "\_\_main\_\_"} guard
|
|
\item Inconsistent error handling and status assignment
|
|
\item Hard-to-follow control flow with nested \texttt{if}/\texttt{elif}/\texttt{continue}
|
|
\end{itemize}
|
|
|
|
\end{document}
|