Questions tagged «object-oriented»

一种使系统能够建模为一组对象的方法论,这些对象可以模块化方式进行控制和操作

12
编写代码方法论的逐渐转变是否会影响系统性能?我应该在乎吗?
TD; DR: 关于我在问的问题有些困惑,所以这是问题背后的驱动思想: 我一直希望这个问题是什么。我本来可能说得不太好。但是其意图一直是“ 模块化,分离,松散耦合,解耦,重构的代码 ”,其本质明显比“ 整体式单一单元,在一个地方完成所有工作,一个文件,紧密耦合的 ”代码慢。剩下的只是我当时或现在或以后会遇到的细节和各种表现形式。在某种程度上,它肯定较慢。就像无碎片磁盘一样,您必须从任何地方拾起碎片。慢一点 当然。但是我应该在乎吗? 问题不在于... 与微优化,过早优化等无关。这与“优化这一部分或死亡”无关。 之后怎么样了? 它涉及随着时间而出现的有关编写代码的总体方法,技术和思考方式: “将此代码作为依赖项注入到您的类中” “每个班级写一个文件” “将视图与数据库,控制器,域分开”。 不要编写意大利面同质的单个代码块,而是编写可以协同工作的许多单独的模块化组件 它是关于在十年内当前在大多数框架中看到和倡导的代码的方式和样式,这些框架是在大会上倡导的,并且是通过社区传播的。这是思维方式从“整体块”到“微服务”的转变。随之而来的是机器级别的性能和开销,以及一些程序员级别的开销。 原始问题如下: 在计算机科学领域,我注意到编程方面的思维方式发生了显着变化。我经常遇到这样的建议: 编写较小的函数式代码(这种方式更具可测试性和可维护性) 将现有代码重构为越来越小的代码块,直到大多数方法/函数只有几行长并且很清楚它们的目的是什么(与更大的整体块相比,它创建了更多函数) 编写只做一件事的函数-关注点分离等(通常会在堆栈上创建更多函数和更多帧) 创建更多文件(每个文件一个类,用于分解目的的更多类,用于诸如MVC,域架构,设计模式,OO等层的目的,这会创建更多文件系统调用) 与“旧”或“过时”或“意大利面条”编码实践相比,这是一个变化,在常规编码实践中,您的方法跨越2500行,并且大型类和上帝对象可以完成所有工作。 我的问题是这样的: 当涉及到机器代码,1和0,汇编指令以及HDD盘片时,我应该完全担心我的类完全分离的OO代码以及各种重构的小型函数和方法也会生成额外的开销? 细节 尽管我对ASM到底如何处理OO代码及其方法调用以及DB调用和编译器调用如何转换为在HDD磁盘上移动执行器臂的方式并不太熟悉,但我确实有一些想法。我假设每个额外的函数调用,对象调用或“ #include”调用(在某些语言中)都会生成一组额外的指令,从而增加代码量并增加各种“代码接线”开销,而无需添加实际的“有用”代码。我还认为可以在ASM实际上在硬件上运行之前对其进行良好的优化,但是优化也只能做很多事情。 因此,我的问题是-与“包含一个大方法,其中包含一个大方法一切都放在一个整体文件中”,由于这种开销? 为清楚起见,更新: 我假设采用相同的代码并将其拆分,重构,解耦为越来越多的函数,对象以及方法和类将导致越来越多的参数在较小的代码段之间传递。因为可以肯定的是,重构代码必须保持线程运行,并且这需要传递参数。与单个整体类或方法相比,更多的方法,更多的类或更多的Factory Method设计模式导致传递更多信息位的开销更大。 有人说(引用待定),所有代码中多达70%是由ASM的MOV指令组成的-向CPU寄存器加载适当的变量,而不是进行实际的计算。就我而言,您可以使用PUSH / POP指令来加载CPU时间,以提供各种代码之间的链接和参数传递。您编写的代码段越小,所需的“链接”开销就越大。我担心这种联系会增加软件的膨胀和减慢速度,我想知道我是否应该关注这一点,以及是否要关注(如果有的话),因为现在和将来的下一代程序员都在为下个世纪构建软件,则必须使用和使用使用这些做法构建的软件。 更新:多个文件 我现在正在编写新代码,正在逐渐替换旧代码。特别是我注意到旧的类之一是〜3000行文件(如前所述)。现在,它已成为位于各个目录中的15-20个文件的集合,包括测试文件,不包括我用来将某些东西绑定在一起的PHP框架。还有更多文件。对于磁盘I / O,加载多个文件比加载一个大文件要慢。当然,并非所有文件都已加载,它们是根据需要加载的,并且存在磁盘缓存和内存缓存选项,但我仍然相信,这loading multiple files需要比loading a single file内存更多的处理工作。我将其添加到我的关注中。 更新:依赖注入所有内容 过一会儿再说。我认为我的问题被误解了。也许我选择误解了一些答案。我并不是在谈论微优化,因为一些答案已经被挑出来了(至少我认为我所说的关于微优化的说法是用词不当),而是整体上“重构代码以放松紧密耦合”的动向。 ,在代码的每个级别。我是最近从Zend Con来的,这种风格的代码一直是公约的核心和核心内容之一。从视图中解耦逻辑,从模型中解脱视图,从数据库中解脱模型,并且如果可能的话,从数据库中解耦数据。依赖-注入所有内容,有时意味着只添加什么都不做的接线代码(函数,类,样板),但可以用作接缝/勾点,在大多数情况下,很容易使代码大小加倍。 …

3
OO中传递的消息是什么?
我一直在研究OO编程,主要使用C ++,C#和Java。我以为我对封装,继承和多态性有了很好的了解(以及在此站点上阅读了很多问题)。 似乎突然出现的一件事是“消息传递”的概念。显然,在以当今主流语言进行OO编程时,并没有使用此方法,但是Smalltalk支持了这种方法。 我的问题是: 什么是消息传递?(有人可以举一个实际的例子吗?) C ++,C#或Java是否支持这种“消息传递”?
35 java  c#  c++  object-oriented 


11
面向对象编程的优点
注意:这个问题是我几个月前写的博客文章的摘录。在对Programmers.SE 的评论中放置了指向博客的链接后,有人要求我在此处发布问题,以便他们回答。此公告是我最流行,因为人们似乎键入“我不明白面向对象编程”到谷歌很多。请随时在此处回答,或在Wordpress上发表评论。 什么是面向对象的编程?没有人给我满意的答案。我觉得您不会从一个鼻子朝天说“对象”和“面向对象”的人那里得到一个很好的定义。从一个只做面向对象编程的人那里也不会得到一个好的定义。没有人同时了解过程式程序设计和面向对象程序设计,我从未对一种面向对象程序的实际作用有一致的认识。 有人可以给我他们关于面向对象编程优势的想法吗?

3
Java开发是否通常比C#/。NET涉及更多的子类化?
我最近开始研究Android开发。这使我回到了Java软件开发领域。我承认,上一次我使用Java时,我对OOP的了解不如现在(我认为)那么多。 在我的职业生涯中主要使用C#之后,我注意到Java和C#在继承使用方式方面的惊人差异。 在C#中,似乎在大多数情况下都可以避免继承。通常,可以通过使用.NET框架的具体类来完成当前的任务。 在Java中,从我从代码示例中收集的信息来看,Java框架似乎提供了许多接口或抽象类,这些接口或抽象类将由开发人员实现/扩展。 这似乎太大了,不能简单地归结为风格。这背后的原因是什么?我觉得直到我理解这一点,我才会写干净的Java代码。 此外,这是否仅限于Android SDK还是Java范围内的OOP方法? 或换种说法, 这两种语言(似乎鼓励)比另一种或多或少使用继承的设计是什么? 如果语言对继承的处理相同,并且假设我的观察是有效的,则意味着这与框架/库的设计有关,而与语言无关。这种设计的动机是什么?

2
如何改进Bloch的Builder模式,使其更适合在高度可扩展的类中使用
Joshua Bloch的《 Effective Java》(第二版)对我的影响很大,可能比我所读过的任何编程书都影响更大。特别是他的“建造者模式”(项目2)产生了最大的影响。 尽管Bloch的构建者在几个月内使我比过去十年更深入,但我仍然发现自己碰壁:使用自返回方法链扩展类充其量是令人沮丧的,更糟的是噩梦--especially当仿制药开始发挥作用,并特别与自我参照仿制药(如Comparable<T extends Comparable<T>>)。 我有两个主要需求,在这个问题中,我只想关注其中的第二个需求: 第一个问题是“如何共享自返回方法链,而不必在每个...单个...类中重新实现它们?” 对于那些可能感到好奇的人,我已经在本答案的底部讨论了这一部分,但这不是我想在这里重点讨论的。 我要评论的第二个问题是“如何在自己打算由许多其他类扩展的类中实现构建器?” 与构建者一起扩展课程比没有构建者扩展难度更大。扩展具有构建器的类也很麻烦,Needable因此也具有重要的泛型。 所以这是我的问题:我如何改进(称为)Bloch Builder,这样我就可以随意将构建器附加到任何类上,即使该类是可能成为“基础类”的,扩展和扩展了许多次- 在不影响我的未来自我或我的图书馆用户的情况下,由于构建器(及其潜在的泛型)施加了额外的负担吗? 附录 我的问题集中在上面的第2部分,但是我想详细说明问题一,包括如何处理它: 第一个问题是“如何共享自返回方法链,而不必在每个...单个...类中重新实现它们?” 这并不是要防止扩展类不得不重新实现这些链,当然,它们必须-而是如何防止希望利用这些方法链的非子类重新实现。 -实现每个自返回功能,以便他们的用户能够利用它们?为此,我提出了一个需要需求的设计,我将在此处打印界面框架,并暂时保留该框架。它对我来说效果很好(此设计需要花费数年的时间……最难的部分是避免循环依赖): public interface Chainable { Chainable chainID(boolean b_setStatic, Object o_id); Object getChainID(); Object getStaticChainID(); } public interface Needable<O,R extends Needer> extends Chainable { boolean isAvailableToNeeder(); Needable<O,R> startConfigReturnNeedable(R n_eeder); R getActiveNeeder(); boolean …

6
为什么在课堂上使用“最终”真的很糟糕?
我正在重构PHP OOP旧版网站。 我很想开始在“ make it explicit that the class is currently not extended by anything” 类上使用“最终”。如果我去上课,这可能会节省很多时间,我想知道是否可以重命名/删除/修改protected属性或方法。如果我真的想扩展一个类,我可以删除final关键字来解锁它以进行扩展。 即,如果我参加的班级没有子班,我可以通过将班级标记为最终班来记录该知识。下次访问它时,我不必重新搜索代码库以查看它是否具有子代。从而节省了重构期间的时间。 这似乎是一个明智的节省时间的主意。。。。但是我经常读到,只有在极少数/特殊的场合下才应该使类“最终化”。 也许它搞砸了模拟对象的创建,或者有其他我没有想到的副作用。 我想念什么?

5
Python mixins是反模式吗?
我完全意识到,pylint其他静态分析工具并非一无所知,有时必须不听从他们的建议。(这适用于各种类型的消息,而不仅仅是conventions。) 如果我有像 class related_methods(): def a_method(self): self.stack.function(self.my_var) class more_methods(): def b_method(self): self.otherfunc() class implement_methods(related_methods, more_methods): def __init__(self): self.stack = some() self.my_var = other() def otherfunc(self): self.a_method() 显然,这是人为的。如果您愿意,这是一个更好的示例。 我相信使用“ mixins”来称呼这种风格。 像其他工具,pylint利率这个代码的-21.67 / 10,主要是因为它认为more_methods并related_methods没有self或属性otherfunc,stack,annd my_var因为没有运行的代码,它显然不能看到related_methods和more_methods在混合中implement_methods。 编译器和静态分析工具不能总是解决Halting问题,但是我认为这确实是一种情况,其中查看继承者的内容implement_methods将证明这是完全有效的,并且这很容易做到。 为什么静态分析工具会拒绝这种有效的(我认为)OOP模式? 要么: 他们甚至不尝试检查继承或 不鼓励在惯用且易读的Python中使用mixins #1显然是不正确,因为如果我问pylint告诉我的一类矿井的继承unittest.TestCase使用 self.assertEqual,(仅定义的东西unittest.TestCase),它并没有抱怨。 mixins是unpythonic还是不鼓励使用?

1
方法和属性的通用词是什么?
在类图中,每个类都包含方法和属性。除了内容或项目之类的通用名称外,描述这两个词的正确词是什么? 内容: Orange类扩展了Fruit类并继承了它的东西。 其中东西 =两个方法和属性的单一字


8
使用枚举列表是否是一个好习惯?
我目前正在一个有用户的系统上工作,每个用户都有一个或多个角色。在User上使用Enum值列表是一种好习惯吗?我想不出更好的办法,但这感觉还不错。 enum Role{ Admin = 1, User = 2, } class User{ ... List<Role> Roles {get;set;} }

10
如果可以使用后者,那么“父项x = new Child();”而不是“ Child x = new Child();”是一种不好的做法吗?
例如,我看过一些代码创建了这样的片段: Fragment myFragment=new MyFragment(); 它声明一个变量为Fragment而不是MyFragment,MyFragment是Fragment的子类。我对这行代码不满意,因为我认为该代码应为: MyFragment myFragment=new MyFragment(); 哪个更具体,是真的吗? 还是概括地说,使用以下做法是错误的做法: Parent x=new Child(); 代替 Child x=new Child(); 是否可以在没有编译错误的情况下将前一个更改为后一个?

4
最少知识原理
我了解最少知识原理的动机,但是如果尝试将其应用到我的设计中,则会发现一些缺点。 我在《Head First Design Patterns》一书中发现了该原理的一个示例(实际上是如何不使用它)指定,根据该原理,调用从其他方法返回的对象上的方法是错误的。 但是似乎有时非常需要使用这种功能。 例如:我有几个类:video-capture类,编码器类,streamer类,它们都使用一些基本的其他类VideoFrame,并且由于它们彼此交互,因此它们可以执行以下操作: streamer 班级代码 ... frame = encoder->WaitEncoderFrame() frame->DoOrGetSomething(); .... 如您所见,此原理在这里不适用。可以在这里应用该原理,还是不能总是在这样的设计中应用该原理?


3
最小惊讶的原理是什么?
在编程中,什么是最小惊讶原理?这个概念与设计好的API有什么关系?这是否仅适用于面向对象的编程,还是也渗透到其他编程技术中?这是否与“在您的方法中做一件事情并做好事”的原则有关?

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.