我正在尝试学习面向对象的编程,但我很难克服我的结构化编程背景(主要是C,但随着时间的推移,很多其他人).我以为我会写一个简单的支票登记程序作为练习.我把一些东西很快地放在了一起(python是一种很棒的语言),我的数据包含在一些全局变量和一堆函数中.我无法弄清楚是否可以通过创建一些类来封装一些数据和函数来改进这种设计,如果是这样,如何更改设计.
我的数据基本上是一个帐户列表['check','saving','Amex'],一个类别列表['food','shelter','transportation']和代表交易的dicts列表[{'date ':xyz,'cat':xyz,'amount':xyz,'description':xzy].每个帐户都有一个相关的dicts列表.
然后,我在帐户级别(create-acct(),display-all-accts()等)和事务级别(display-entries-in-account(),enter-a-transaction(),edit)中有函数-a-transaction(),display-entries-between-dates()等)
用户看到一个帐户列表,然后可以选择一个帐户并查看基础交易,并能够添加,删除,编辑等帐户和交易.
我目前在一个大类中实现所有内容,因此我可以使用self.variable,而不是显式的全局变量.
简而言之,我试图弄清楚是否将其重新组织到某些类中是有用的,如果是,那么如何设计这些类.我读过一些oop书籍(最近的面向对象思想过程).我喜欢认为我现有的设计是可读的,不会重复.
任何建议,将不胜感激.
您不必抛弃结构化编程来进行面向对象的编程.代码仍然是结构化的,它只是属于对象而不是与它们分开.
在经典编程中,代码是对数据进行操作的驱动力,导致二分法(以及代码可以对错误数据进行操作的可能性).
在OO中,数据和代码是密不可分的 - 一个对象包含数据和操作该数据的代码(尽管从技术上讲,代码(有时是某些数据)属于类而不是单个对象).任何想要使用这些对象的客户端代码都应该只使用该对象中的代码.这可以防止代码/数据不匹配问题.
对于簿记系统,我会按如下方式处理:
请记住,这是系统的"后端"(数据模型).您希望有单独的类来查看数据(视图),这将允许您根据用户首选项轻松更改它.例如,您可能需要整个分类帐,只需要资产负债表或只需要损益表.或者您可能需要不同的日期范围.
有一点我要强调要建立一个好的会计系统.你也需要考虑像一个簿记员.我的意思是失去"帐户"和"类别"之间的人为差异,因为它会使您的系统更清洁(您需要能够在两个资产类帐户之间进行交易(例如银行转帐)如果每个事务都需要一个"类别",那就行了.数据模型应该反映数据,而不是视图.
唯一的困难是记住资产级账户与您的预期相反(您的银行现金的负值意味着您在银行有钱,而您对该公司跑车的高正值贷款是债务,例如).这将使复式方面完美运行,但您必须记住在显示或打印资产负债表时扭转资产类别账户(资产,负债和权益)的迹象.