面向对象的设计?

6 python oop

我正在尝试学习面向对象的编程,但我很难克服我的结构化编程背景(主要是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书籍(最近的面向对象思想过程).我喜欢认为我现有的设计是可读的,不会重复.

任何建议,将不胜感激.

pax*_*blo 7

您不必抛弃结构化编程来进行面向对象的编程.代码仍然是结构化的,它只是属于对象而不是与它们分开.

在经典编程中,代码是对数据进行操作的驱动力,导致二分法(以及代码可以对错误数据进行操作的可能性).

在OO中,数据和代码是密不可分的 - 一个对象包含数据和操作该数据的代码(尽管从技术上讲,代码(有时是某些数据)属于类而不是单个对象).任何想要使用这些对象的客户端代码都应该只使用该对象中的代码.这可以防止代码/数据不匹配问题.

对于簿记系统,我会按如下方式处理:

  1. 低级别的对象是账户和类别(实际上,在会计中,这些之间没有区别,这是一种错误的分离,只会加剧Quicken等将资产负债表项目与损益表分开 - 我将它们仅称为账户).一个帐户对象包括(例如)帐户代码,名称和起始余额,尽管在我所使用的会计系统中,起始余额始终为零 - 我总是使用"启动"事务来初始设置balanaces .
  2. 交易是一个平衡的对象,由一组具有相关变动的账户/类别组成(美元价值的变化).平衡,我的意思是他们必须总和为零(这是双重会计核算的关键).这意味着它是一个日期,描述和元素的数组或向量,每个元素都包含一个帐户代码和值.
  3. 整个会计"对象"(分类帐)就是所有帐户和交易的列表.

请记住,这是系统的"后端"(数据模型).您希望有单独的类来查看数据(视图),这将允许您根据用户首选项轻松更改它.例如,您可能需要整个分类帐,只需要资产负债表或只需要损益表.或者您可能需要不同的日期范围.

有一点我要强调要建立一个好的会计系统.你需要考虑像一个簿记员.我的意思是失去"帐户"和"类别"之间的人为差异,因为它会使您的系统更清洁(您需要能够在两个资产类帐户之间进行交易(例如银行转帐)如果每个事务都需要一个"类别",那就行了.数据模型应该反映数据,而不是视图.

唯一的困难是记住资产级账户与您的预期相反(您的银行现金的负值意味着您在银行有钱,而您对该公司跑车的高正值贷款是债务,例如).这将使复式方面完美运行,但您必须记住在显示或打印资产负债表时扭转资产类别账户(资产,负债和权益)的迹象.


Mit*_*eat 5

不是你的问题的直接答案,但O'Reilly 首先面向对象的分析和设计是一个很好的起点.

其次是Head First Design Patterns