zoukankan      html  css  js  c++  java
  • ATM三层架构思路

        首先将ATM分为三层架构来做:用户视图层、逻辑接口层、数据处理层。

        1、用户视图层用 输入(input)输出(print)来进行模拟:例如转账功能,我们就需要接受用户的输入,需要三个参数:用户自己,转账目标用户与转账金额,然后去调用逻辑接口层来做具体的处理。

    @common.auth
    def transfer():
    print('欢迎来到转账功能'.center(30, '='))
    while True:
    transfer_user = input('请输入收款人用户名:').strip()
    transfer_money = input('请输入转账金额:').strip()
    flag, msg = bank_interface.transfer_interface(login_user, transfer_user, transfer_money)
    if flag:
    print(msg)
    break
    else:
    print(msg)

        2、逻辑接口层,定义功能函数以便于用户视图层来调用功能,转账功能接口接收到用户传入进来的三个参数,去调用数据处理层返回用户自己的数据与转账目标用户的数据,逻辑接口层进一步进行判断,首先是判断转账目标用户是否存在,不存在返回False与对应的提示信息,存在让他进一步操作,去查看用户自己的金额是否大于转账金额,如果小于转账金额,我们是不允许他继续转的,直接返回False与对应的提示信息,如果转账目标用户存在与用户自己余额足够的时候我们就应该让他进行转账操作了,应该进行用户自己的金额减去转账金额,转账目标用户加上转账金额,然后再将用户自己的信息与转账目标用户的信息保存到文件(模拟数据库)中去。只要涉及到数据的增删改查我们就应该交给数据处理层,所以查询与保存用户的信息就应该交给我们的第三层数据处理层来做。

       

    # 用户转账接口
    def transfer_interface(username, transfer_user, transfer_money):
    transfer_user_dic = db_handler.select(transfer_user)
    if not transfer_user_dic:
    return False, '转账目标用户不存在,请谨慎操作'
    user_dic = db_handler.select(username)
    balance = user_dic['balance']
    balance = float(balance)
    transfer_money = float(transfer_money)
    if balance < transfer_money:
    return False, f'用户{username}余额不足无法进行转账'
    balance -= transfer_money
    user_dic['balance'] = balance
    res = f'用户{username}转账给用户{transfer_user} 金额:{transfer_money}$'
    user_dic['water'].append(res)
    bank_logger.info(res)
    db_handler.save(user_dic)
    transfer_balance = transfer_user_dic['balance']
    transfer_balance = float(transfer_balance)
    transfer_balance += transfer_money
    transfer_user_dic['balance'] = transfer_balance
    res1 = f'用户{transfer_user}收到用户{username}转账金额:{transfer_money}$'
    transfer_user_dic['water'].append(res1)
    bank_logger.info(res1)
    db_handler.save(transfer_user_dic)
    return True, f'用户{username}转账成功 转账金额:{transfer_money}$'

    3、数据处理层,用文件处理来模拟数据库,数据处理层应该提供给逻辑接口层一些增删改查的数据操作,它们需要的时候就来调用相应的方法来对数据进行操作。

    import json
    import os
    from conf import settings


    # 查询用户数据
    def select(username):
    # 获取用户个人文件路径
    user_path = os.path.join(
    settings.USER_DATA_PATH, f'{username}.json'
    )
    # 如果有返回用户字典信息
    if os.path.exists(user_path):
    with open(user_path, 'r', encoding='utf-8') as f:
    user_dic = json.load(f)
    return user_dic
    # 没有默认返回None


    # 保存用户数据
    def save(user_dic):
    # 获取用户字典中的用户名
    username = user_dic.get('username')
    # 获取用户个人文件路径
    user_path = os.path.join(
    settings.USER_DATA_PATH, f'{username}.json'
    )
    # 将用户字典写入用户个人文件
    with open(user_path, 'w', encoding='utf-8') as f:
    json.dump(user_dic, f, ensure_ascii=False)

    所有功能都可以分为以上三步骤进行一些相应的操作。(只要思想不滑坡,方法总比问题多)
  • 相关阅读:
    iphone5刷机教程
    ios开发之--/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby: bad interpreter: No such file
    浅谈iPhone OS(iOS)架构
    ios开发之--使用xib适配iPhone X
    ios开发之--armv7,armv7s,arm64,i386,x86_64详解
    ios开发之--UIButton中imageView和titleLabel的位置调整
    gem install cocoapods ERROR: While executing gem ... (Gem::FilePermissionError)
    ios开发之NSString用strong还是用copy?
    ios开发之--高德地图以及自定义大头针和气泡、导航
    iOS
  • 原文地址:https://www.cnblogs.com/h1227/p/12628653.html
Copyright © 2011-2022 走看看