如何练习面向对象的编程?[关闭]


13

我一直使用过程语言进行编程,目前正朝着面向对象的方向发展。我面临的主要问题是我看不到一种有效地练习面向对象的方法。我会解释我的观点。当我学习PHP和C时,它很容易实现:只是选择一些东西并考虑该东西的算法。

例如,在PHP中,坐下来思考是一件很重要的事情:“好吧,为了练习,让我在一个可以添加产品的管理区域构建一个应用程序”。这非常简单,只需考虑一种算法即可注册一些用户,登录该用户并添加产品。结合使用这些功能和PHP功能,这是练习的好方法。

现在,在面向对象方面,我们还有很多其他东西。这不仅仅是考虑算法的问题,还包括更深入地分析需求,编写用例,弄清楚类图,属性和方法,设置依赖注入以及许多其他事情。

要点是,在我学习面向对象的方式中,一个好的设计似乎至关重要,而在过程语言中,一个模糊的想法就足够了。我并不是说在过程语言中我们可以不用设计就可以编写好的软件,只是为了实践而可行,而在面向对象的情况下,即使没有实践也要经过良好的设计似乎是不可行的。

这似乎是一个问题,因为如果每次我要练习时,我都需要弄清大量的需求,用例等,这似乎并不是提高对象定向的好方法,因为这需要每次练习时,我对应用程序都有一个完整的想法。

因此,练习面向对象的好方法是什么?


1
在我大学的早年期间,Bruce Eckel撰写了《 Thinking in Java》一书,对OOP进行了很好的介绍。对于编程新手和程序开发背景的人来说,这是推荐的读物-也许会对您有所帮助。
Ivaylo Slavov 2013年

3
PHP是面向对象的;您只是没有使用过。 php.net/manual/en/language.oop5.php
Robert Harvey

您可以使用OOP方法再次实现相同的应用程序。毕竟,它只是一个工具。从下面的建议开始,推荐有一本书,并尝试以面向对象的方式重新考虑您现有的过程代码,这也是一个好习惯。
JensG

开始时制作小型游戏(无图形),纸牌游戏或类似产品,尝试重用这些游戏中的类。 stackoverflow.com/questions/1301606/…–
grizwako

Answers:


20

现在,在面向对象方面,我们还有很多其他东西。

不,你不...

这不仅仅是考虑算法的问题,还包括更深入地分析需求,编写用例,弄清楚类图,属性和方法,设置依赖注入以及许多其他事情。

这些东西都不是实践面向对象编程所必需的。

这非常简单,只需考虑一种算法即可注册一些用户,登录该用户并添加产品。

所有面向对象的编程都没有考虑执行这些步骤的算法,而是考虑了执行这些步骤所需的对象-所需的功能,所需的状态以及要公开的接口类型给用户。就像您必须在过程编程中一样。

唯一的区别是,您不必关注于所需的功能及其工作方式,而是关注功能和状态如何划分为职责以及这些职责如何交互。

怎么练习?练习过程编程的方式相同:选择一个问题,然后使用捆绑的类解决问题。找出问题的根源,然后重复经验教训。


3
+1“弄清楚它是怎么吸的”这就是我的编码方式:充满羞耻和自我厌恶……一直在努力学习以前的项目。
WernerCD 2013年

1
我喜欢这种方法。不必过度复杂并尝试一次学习所有内容,而应从较小的步骤开始,然后反复应用所获得的所有知识。
2013年

6

好问题。当然,您要说的是实践OOP实际上意味着实践所有这些事情(需求分析,用例,设计模式等),这是正确的,乍看起来似乎令人生畏。

我的建议是,请牢记两件事来开始您的练习课程:测试驱动的开发单一职责原则

然后就像使用PHP / C一样开始:提出一个想法,考虑一下您需要什么,然后一个接一个地实现这些东西。但是,请记住,您需要从测试开始(这将迫使您定义适当的接口,否则可测性会立即受损),并且TDD意味着一个红绿色重构周期。换句话说,您只有一点点功能,一旦开始工作,您就可以重构以得到一个适当的面向对象设计,如果您从一开始就没有做(您不会做)。

执行此重构步骤时,请始终提醒您自己SRP。如果您向对象添加了第二项责任,那么该创建新的东西了。

当您以这种方式进行开发时,您需要意识到最终的解决方案将与开始时有所不同。您的学习曲线也将非常陡峭。例如,您将不会学习什么是Factory模式,而是会认识到需要某种以不同方式创建类实例的东西。因此,如果您根本没有听说过面向对象的设计模式,那么最好并行阅读一下。


1
因此,基本上,您说的是“学习TDD和GOF”
Robert Harvey

3

如果您刚开始使用OOP,则可以通过查看几乎任何现实系统并考虑对象是什么以及它们之间的关系以及它们可能支持和使用的方法/接口来娱乐自己并离线“练习”。如何在类层次结构中以及作为实例化对象的集合来表示它们,以及对象所有权关系将是什么等等(请注意:上面我根本没有提到“算法”一词)。在考虑编写任何代码之前,请绘制大量图表(学习一些UML或类似内容)。

这将帮助您更好地理解IS-A和HAS-A的关系,这可能是任何OOP设计中最重要的分类(尽管如此,它似乎仍然是许多经验丰富的OOP语言程序员所苦苦挣扎的东西。 )。如果您掌握IS-A / HAS-A,那么还有IS-IMPLEMENTED-IN-TERMS-OF(我也将其描述为IS-KIND-OF-A:^)

认真地说,下次去超市的时候,想象一下有人给你写了这个地方的OOP模拟的工作...


如果您正在编写软件来帮助生物学家追踪带有无线电标记的老虎,那么老虎是动物(动物,有条纹)的事实无关紧要,也不会在软件中反映出来。但是,如果您从抽象角度考虑is-a和has-a的老虎,那就是您所得到的。
萧伯纳

1
但是,这就是为什么我建议进行这种锻炼的原因,因为应该很快就清楚地知道老虎和条纹与良好的解决方案无关,而跟踪的坐标是否源自(猜测)GPS,惯性导航或无线电三角测量可能会很快跟踪器OOP设计应该捕获的东西。当我说“看一个现实世界的系统”时,我的意思确实是要超越纯粹的物理属性。例如,超市模拟肯定需要包括更多的抽象概念,例如“队列”,而不仅仅是明显的“购物车”和“购物者”。
2013年

1

我记得在我的C时代(很久以前),我们曾经根据职责将函数和过程分离到不同的文件中。我并不是说这是完美的,而是我真正开始使用面向对象语言进行编程的一个很好的起点。因此,也许可以从将文件转换为对象开始。

就OOP而言,它实际上就是实践和努力改进。很少有人从头开始做对。因此,迭代会在项目的整个生命周期中发生。


0

让我们添加一些术语,面向对象的分析面向对象的设计,就像Peter Coad在1990年代所做的那样。

这些共同构成了软件工程学科OOAD,该学科可以(正确执行)在编写和测试代码时为程序员提供支持。然后,面向对象的编程可以具有适当的粒度级别,可以熟练地使用编程语言功能来满足项目级别上指定的功能目标和设计要求。

有时这是一个人的项目,然后您必须戴好所有帽子(但不一定要同时戴所有帽子)。对于自己的个人项目,我非常喜欢测试驱动的开发(请参见Frank的建议),但它不仅与面向对象的软件开发有关。

在团队项目中,职责分工是成功实施的关键。熟练使用面向对象的设计模式,可以通过限制分析,数据馈送和共享共享可用框架的业务逻辑所需的可见接口来帮助团队理解。


0

“好吧,为了练习,让我在可以添加产品的管理区域中构建一个应用程序”。这非常简单,只需考虑一种算法即可注册一些用户,登录该用户并添加产品。

为什么这次只对用户对象和产品对象不做同样的事情?同样,如果您使用的是同时支持过程和OO的语言,则可以尝试基于过程标准库实现对象,例如文件对象。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.