14

我一直在做我自己的一些项目,没有任何工业接触。目前,我使用简单的方法来开发具有可忽略的 OO 方法的小型应用程序,例如使用函数的多态性为数据库函数创建一个通用类,稍微使用构造函数,但我真的不知道如何使用 OOP 实现整个项目逻辑。

我知道什么是接口、抽象类、密封类和其他 oops 概念,并且非常清楚。但问题是我应该何时以及如何在我应该的地方大量实施 OOP。

我是否需要研究实时应用程序及其案例研究,如果需要,请向我推荐一些网站或书籍/电子书,我可以从中阅读并能够实施它们。

目前我在编程时觉得自己不完整。我有效地实现了数据库及其大部分组件,但是在尝试使用 OOP 时还是个孩子。

我已经阅读了许多示例,这些示例试图让人们理解 OOP 之类的形状,例如汽车。所有这些。他们很想清楚概念,但不足以在一些现场项目中实施

4

6 回答 6

16

学习应用 OOP 的第一步是将常见的功能和数据收集到类中。一开始你不会做得很好,但你会变得更好。Code Magazine 最近的一篇关于回归基础的文章很好地表达了这一点。

开始尝试制作(将成为的类)代表解决方案中真实事物的真实对象。(有一个花哨的名字,但它也是非常基本的。)这并不是让实用程序类成为方便的、与主题相关的功能。尝试安排事情,以便在对象中维护的数据在调用该对象的方法时为您保存参数。将存在的对象想象为社区中真实的个体事物。拟人化他们。安排事情,这样您在使用它们的功能时就不必担心课堂上发生了什么。

一开始我不会担心所有这些设计模式。最好先练习您所学的基本 OOP 概念。专注于这些模式会导致很多人跳过真正思考 OOP 的哲学,而是试图将他们的情况塞进一个预先打包的计划中。阅读有关娱乐和创意的“设计模式”。稍后,您将想要真正研究它们并尝试专门实施其中的一些。

简而言之,你必须投入并开始应用你所学的知识。在你做出一些好的设计之前,你需要先做出一些糟糕的设计,所以不要担心。

针对提问者的评论进行编辑:我认为下一步可能是专注于您的班级之间的关系。例如,一旦您在逻辑中使用了 Customer 对象,您就必须不费吹灰之力获取相关的 Order 对象。创建一个属性oCustomer.Orders,即返回List<Order>。(这是 ac# 示例。)在此属性中获取该客户的所有订单,将它们放入列表对象中,将其保存在私有变量中以防再次调用该属性,然后返回该列表对象。如果您已经这样做了,请寻找下一个最难尝试的新事物。也许您需要经常查找客户首次下订单的日期。然后,创建一个继承自的 Orders 类Collection<order>来替换您的基本List<order>,并添加属性 FirstOrder。然后你就可以做到了var FirstOrderDate = oCustomer.Orders.FirstOrder.OrderDate

继续尝试做下一个最难的新事物。继承和添加成员。用子类创建一个基类。覆盖基类成员。使用并获得良好的自定义集合。

从您正在使用的对象模型中学习。当您看到直观且易于使用的东西时,请这样做!在我职业生涯的早期,我不得不广泛使用直观且简单的 MS-word 对象模型。当我创建自己的库时,我试图复制这种感觉。结果很好。

最终研究模式。尽管我建议您不要对它们过于敬畏,但它们是想法的重要来源,最重要的是可以尝试的东西。(了解常见“模式”的名称也有利于交流。)例如,当您看到插件模型时,接口的概念就会真正有意义。

于 2009-12-24T18:43:02.857 回答
4

这是一个很难解决的问题——良好的面向对象设计只有在您拥有构建实际应用程序的经验、不得不更改它们、被迫重新评估您的原始设计等等之后才会成为第二天性。大多数例子都是微不足道的,这使问题更加复杂。

我可以建议的最好的事情是如果您搜索设计模式的实现。这些并不总是提供非平庸/琐碎的示例,但当您在其他人的软件中看到 OO 原则时,它们将有助于识别它们的应用。您可以做的另一件事是尝试自己创建一系列常见模式的真实实现。然后,当您编写生产应用程序时,希望您能够建立联系并应用相关的模式/原则/设计技术。

简而言之,经验是无可替代的。

对于真正的代码,我会开始研究一些你感兴趣的项目,比如codeplex

这是 GOF 设计模式的经典列表

以下是一些常见模式的示例:

于 2009-12-24T18:28:11.000 回答
3

首先,我只想建议您使用 OOP 而不是 OOPS。OOP 是一种编程范式,因此“系统”部分并不是真正必要的(但这当然只是一种观点)。此外,大多数人更容易识别 OOP,因此它会让您的问题更容易理解。最后,因为 OOPS 使面向对象编程看起来像一个错误(呵呵……抱歉,开个玩笑)。当然,这只是我的看法,我当然可能是错的。

不管怎样,说正事。我认为您遇到问题是因为您在计划阶段开始时考虑过度。停止思考每个对象具有的方法和属性。不要考虑它有什么用,或者你将如何使用它。忘记计算机以及您将如何实现它。只需列出想到的任何对象。您提到了制作数据库应用程序。您可以从要保存的数据开始。例如,如果你要创建一个学生数据库,你可能想要创建一个Student对象。您还需要一种连接到数据库的方法,因此您可能希望一个对象充当与数据库的连接。当然,这两个对象只是建议;是否要使用它们取决于您。

在列出一长串物品后,开始查看您制作的物品并列出它们的作用。仅仅因为一个对象不做任何事情,并不意味着您应该将其从列表中删除。以“学生”对象为例。这个对象可能由 getter 和 setter 组成,但它是一个学生模型,因此在数据库系统中非常有用。如果您了解 C 编程语言,您可以将 'Student' 对象视为一个结构. 完成此列表后,请尝试组合看起来非常相似的对象。删除没有任何事情可做的对象,被动(如存储数据)或主动(如连接到数据库,或获取用户输入)。你应该有你的对象,以及它们的大部分属性和方法。剩下要做的就是实现这些对象并添加更多功能。

为了进一步理解这一点,我建议阅读实体关系图。这应该对您的设计有所帮助。因为我相信你是在想太多事情,所以我建议你暂时不要阅读模式和 GOF,因为它可能会让你更加困惑。当你超越这个障碍时,它会很好地为你服务,但现在,它只会给你的问题增加更多的层次。

于 2009-12-24T19:34:46.247 回答
1

我相信您正在寻找的是面向对象的设计模式。通常,许多最佳 OOP 原则都以标准设计模式实现,可用于多种类型的项目。

许多开发人员在查看问题时会尝试将其放入标准设计模式中,如果使用得当,可以加快开发速度!

我建议阅读面向对象的设计模式以及如何应用它们。一个很好的例子是在工厂方法模式中使用抽象类或接口。

维基百科(http://en.wikipedia.org/wiki/Factory_method_pattern

于 2009-12-24T18:29:39.327 回答
1

首先,我会推荐这本关于设计模式的经典书籍。http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612/ref=sr_1_1?ie=UTF8&s=books&qid=1261679601&sr=8-1

但归根结底,真正重要的是在大型现实生活项目中的工作经验!当你开始工作,几年后,一切都会变得清晰得多。

于 2009-12-24T18:35:59.407 回答
1

有一次,我正在阅读 Kent Beck 的“示例测试驱动开发”。整本书的第一部分是 Beck 一步一步设计一个功能的演练。我发现它非常有帮助,因为您会看到这个过程以一种有机的方式发生——从很少的课程开始,随着时间的推移而发展。
我认为从模式开始不一定是一个好主意。设计模式很棒,但我发现只有在实际项目中首先做错了设计模式,并且了解了 OO 中哪些有效,哪些无效后,它们才变得有用。

于 2009-12-24T20:01:40.700 回答