自从我开始研究面向对象编程以来,我经常阅读文章/博客,说功能更好,或者不是所有问题都应该建模为对象.从您的个人编程冒险,您认为OOP何时能更好地解决问题?
Xet*_*ius 29
没有硬性规定.当你更善于解决问题和思考OO心态时,用OOP可以更好地解决问题.面向对象只是尝试使计算成为解决问题的更好工具的另一个工具.
但是,它可以允许更好的代码重用,并且还可以导致更整洁的代码.但这些高度赞扬的品质往往具有很小的实际价值.将OO技术应用于现有的功能应用程序可能会导致很多问题.技能在于学习许多不同的技术并应用最适合手头的问题.
OO经常被引用为类似Nirvana的软件开发解决方案,但是有很多时候不适合应用于手头的问题.它经常会导致问题的过度设计,以达到完美的解决方案,而这通常是不必要的.
从本质上讲,OOP并不是面向对象的编程,而是将面向对象思维映射到能够支持OO技术的编程语言.OO技术可以由本身不是OO的语言支持,并且有一些技术可以在函数语言中使用以利用这些优势.
作为一个例子,我已经开发了大约20年的OO软件,所以我倾向于在解决问题时用OO术语来思考,无论我写的是什么语言.目前我正在使用Perl 5.6实现多态,这本身并不是支持它.我选择这样做,因为它将使代码的维护和扩展成为一个简单的配置任务,而不是开发问题.
不确定这是否清楚.在OO法庭上有些人很难,而且在功能法庭上有些人很难.然后有些人尝试过这两种方法,并试图从每个方面都做到最好.两者都不是完美的,但两者都有一些非常好的特性,无论语言是什么,都可以使用.
如果您正在尝试学习OOP,请不要只关注OOP,而是尝试将面向对象分析和一般OO原则应用于问题解决方案的整个范围.
我是一个老计时器,但也已经编程了OOP很长一段时间.我个人反对使用OOP来使用它.我更喜欢对象具有存在的具体原因,他们建模具体的东西,并且它们是有意义的.
我与许多新开发人员的问题在于他们没有使用他们创建的代码消耗资源的概念.在处理大量数据和访问数据库时,"完美"对象模型可能是您可以为性能和资源做的最糟糕的事情.
我的底线是,如果它作为对象有意义,则将其编程为对象,只要您考虑对象模型实现的性能/资源影响.
小智 6
有 5 个标准来决定您是否应该选择面向对象而不是基于对象、函数式或过程式代码。请记住,所有这些样式都适用于所有语言,它们是styles。所有这些都是以“在这种情况下我应该支持面向对象吗?”的风格写的。
该系统非常复杂,有超过大约 9k LOC(任意级别)。——随着系统变得更加复杂,通过封装复杂性获得的好处会大大增加。与其他技术相反,使用面向对象,您倾向于封装越来越多的复杂性,这在这个级别上非常有价值。在此之前应该优先考虑基于对象或程序。(请注意,这并不是在提倡某种特定的语言。在我看来, OO C比 OO C++ 更适合这些功能,OO C++ 因抽象漏洞而臭名昭著,而且甚至能够与 1 个平庸/顽固的程序员共进午餐)。
您的代码不是对数据的操作(即基于数据库或基于数学/分析)。基于数据库的代码通常更容易通过过程风格表示。基于分析的代码通常更容易以函数式风格表示。
你的模型是对某事物的模拟(OO 擅长模拟)。
您正在做的事情,OO 的基于对象的子类型分派很有价值(也就是说,您需要向特定类型和各种子类型的所有对象发送消息,并从所有对象中获得适当但不同的反应) 。
您的应用程序不是多线程的,尤其是在代码库的非工作任务方法类型中。在多线程并且需要不同线程执行不同任务的程序中,面向对象是相当有问题的。如果您的程序由一两个主线程和许多执行相同操作的工作线程构成,则 OO 程序的混乱控制流更容易处理,因为所有工作线程将在它们所接触的内容中被隔离,并且可以被视为一段完整的代码。实际上考虑任何其他范式。函数式擅长多线程(没有副作用是一个巨大的好处),基于对象的编程可以为您带来一些 OO 封装的好处,但在代码库的关键部分中可以提供更多可跟踪的过程代码。当然,程序在这个领域也表现出色。
我认为,当您对这些状态的状态和相关操作进行建模时,它最适合.我猜这有点模糊,但我不确定这里有一个完美的答案.
关于OOP的事情是,它允许您封装和抽象数据和信息,这是构建大型系统的真正福音.您可以对其他范例进行相同的操作,但似乎OOP在此类别中特别有用.
它还取决于您使用的语言.如果它是一种具有丰富OOP支持的语言,您可能应该利用它来获得优势.如果没有,那么您可能需要找到其他机制来帮助将问题分解为更小,易于测试的部分.
我被卖给了OOP。
任何时候你可以为一个问题定义一个概念,它很可能被包装在一个对象中。
OOP 的问题是有些人过度使用它,使他们的代码更难以理解。如果您对放入对象的内容和放入服务(静态类)的内容很小心,您将受益于使用对象。
只是不要将不属于对象的东西放入对象中,因为您需要您的对象做一些您最初没有想到的新东西,重构并找到添加该功能的最佳方法。