Есть ли лучший способ написать это при сохранении его текущей функциональности? (проверка баланса, обновление, вычитание и т. д.) - PullRequest
0 голосов
/ 10 ноября 2018

Есть ли лучший способ написать это при сохранении его текущей функциональности? (проверка баланса, обновление, вычитание и т. д.) Если так, с чего бы мне начать? Я кратко увидел код в классе для похожих вопросов, и он выглядел более упорядоченным.

class Account:

    # constructor
    def __init__(self, name, account_number, balance):
        self.name = name
        self.account_number = account_number
        self.balance = balance

    # returns string representation of object
    def __str__(self):
        return "Account Name: {0}\nAccount Number: {1}\nAccount Balance: ${2:.2f}" \
               .format(self.name, self.account_number, self.balance)

    # add given amount to balance
    def deposit(self, amount):
        self.balance += amount

    # subtract amount and fee from balance
    def withdraw(self, amount, fee):
        self.balance = self.balance - amount - fee

if __name__ == '__main__':
    # make 3 objects
    acct1 = Account('Guy Mann', 90453889, 100)
    acct2 = Account('Donald Duck', 83504837, 100)
    acct3 = Account('Joe Smith', 74773321, 100)

    # print
    print(acct1)
    print(acct2)
    print(acct3)

    # deposit and print
    acct1.deposit(25.85)
    acct2.deposit(75.50)
    acct3.deposit(50)
    print(acct1)
    print(acct2)
    print(acct3)

    # withdraw and print
    acct1.withdraw(25.85, 2.50)
    acct2.withdraw(75.50, 1.50)
    acct3.withdraw(50, 2)
    print(acct1)
    print(acct2)
    print(acct3)

1 Ответ

0 голосов
/ 10 ноября 2018

Всегда есть место для улучшений - хотя SO не совсем подходящее место - вы можете проверить правила помолвки в http://codereview.stackexchange.com и спросить там. Сначала прочитайте правила, опубликуйте их позже или они быстро будут закрыты. На SO мы в основном исправляем неработающий код.


В вашем коде есть некоторые недостатки - особенно на стороне "доверяйте вводу пользователя" - поэтому некоторые улучшения:

  • если на python 3.6 использовать строковую литеральную интерполяцию
  • Защита от злонамеренных пользователей, которые снимают отрицательные числа - также защищает ваших клиентов от внесения отрицательных чисел
  • упростить тестирование, используя списки ( DRY-принцип ) и циклы
  • привязать ваши данные к вашему уникальному идентификатору учетной записи - например, номер счета и использование диктов для присвоения каждой транзакции правильному счету вместо того, чтобы полагаться на «заказ» или что-то подобное. В реальном времени каждая транзакция также имеет уникальные идентификаторы для , какой банк использовать и , какой счет использовать .

Читает:


class Account:

    # constructor
    def __init__(self, name, account_number, balance):
        self.name = name
        self.account_number = account_number
        self.balance = balance

    # returns string representation of object
    def __str__(self):
        return f"Account Name: {self.name}\n" + \
               f"Account Number: {self.account_number}\n" + \
               f"Account Balance: ${self.balance:.2f}\n" 

    # add given amount to balance
    def deposit(self, amount):
        if amount <= 0:
            raise ValueError("Unable to deposit negative or zero amounts\n")
        self.balance += amount
        return str(self) 

    # subtract amount and fee from balance
    def withdraw(self, amount, fee):
        if amount <= 0:
            raise ValueError("Unable to withdraw negative or zero amounts\n")
        self.balance = self.balance - amount - fee
        return str(self)  

Некоторое использование:

accounts = {90453889:Account('Guy Mann', 90453889, 100), 
            83504837:Account('Donald Duck', 83504837, 100),
            74773321:Account('Joe Smith', 74773321, 100)}

# explicitly assign each transaction to the account by accountNr
deposits = [(90453889, 25.85), (83504837, 75.50), (74773321, 50), 
            (90453889, -25085), (0,80)]

withdrawls= [(90453889, (25.85, 2.50)), (83504837, (75.50, 1.50)), 
             (83504837, (-1050, -1.50)),
             (74773321, (50, 2)),(123456789, (50, 2))]

# use exception handling for illict usage of accounts
for number,money in deposits:
    try:
        print( accounts.get(number).deposit(money))
    except AttributeError: 
        print (f"Unknown account: {number}")
    except ValueError as ve:
        print (ve)

for number,(money,fee) in withdrawls:
    try:
        print( accounts.get(number).withdraw(money,fee))
    except AttributeError:
        print (f"Unknown account: {number}")
    except ValueError as ve:
        print (ve)                        

Выход:

Account Name: Guy Mann
Account Number: 90453889
Account Balance: $125.85

Account Name: Donald Duck
Account Number: 83504837
Account Balance: $175.50

Account Name: Joe Smith
Account Number: 74773321
Account Balance: $150.00

Unable to deposit negative or zero amounts

Unknown account: 0
Account Name: Guy Mann
Account Number: 90453889
Account Balance: $97.50

Account Name: Donald Duck
Account Number: 83504837
Account Balance: $98.50

Unable to withdraw negative or zero amounts

Account Name: Joe Smith
Account Number: 74773321
Account Balance: $98.00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...