Questions tagged «object-oriented»

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

2
示例代码解释Joe Armstrong的香蕉猴丛林问题[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 2年前关闭。 乔·阿姆斯特朗(Joe Armstrong)在《工作中的编码员》一书中指出: 我认为缺乏可重用性的是面向对象的语言,而不是功能语言。因为面向对象语言的问题是他们拥有了它们所伴随的所有隐式环境。你想要一个香蕉,但是你得到的是一只大猩猩,抱着香蕉和整个丛林 我在这里不太明白。如果问题出在香蕉上,我们可以将所有逻辑封装在“ getBanana”函数的后面。猴子和丛林在这种情况下是如何参与的。有人可以写一个代码片段来以更容易理解的方式解释问题吗,例如,说明该Banana对象需要Monkeyand Jungle对象才能被启动的事实?

6
从下面的代码片段中跳过太多if / else-if的更好方法是什么?
我正在尝试编写一个servlet,它根据传递给它的“操作”值执行任务。 这是其中的示例 public class SampleClass extends HttpServlet { public static void action1() throws Exception{ //Do some actions } public static void action2() throws Exception{ //Do some actions } //And goes on till action9 public void doPost(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException { String action = req.getParameter("action"); /** * I find …

2
堆栈扩展LinkedList。是否违反了Liskov替代原则?
存在具有诸如add_first(),add_last(),add_after(),remove_first(),remove_last()和remove()之类的函数的LinkedList类。 现在有一个Stack类,提供了push(),pop(),peek()或top()等功能,并且为了实现这些方法,它扩展了LinkedList类方法。这是否违反了《里斯科夫替代原则》? 例如,考虑在add_after()情况下将节点添加到链接列表的第n个位置的情况。这可以在基类中完成,但不能在Stack类中完成。此处的后置条件是否已减弱,或者您是否修改add_after()方法以将其添加到堆栈顶部? 另外,如果不违反,这是不好的设计吗?以及如何使用LinkedList类实现Stack功能?

8
“优先考虑组成而不是继承”-防御签名变更的唯一理由是吗?
此页面使用以下参数提倡在继承上进行组合(用我的措辞重新表述): 当我们使用继承时,超类方法签名的更改(尚未在子类中重写)会在许多地方引起其他更改。但是,当我们使用Composition时,所需的其他更改仅在单个位置:子类。 难道这真的是偏向于继承而不是继承的唯一理由吗?因为是这样的话,即使子类不更改实现(即在子类中放置虚拟替代),也可以通过强制采用提倡重写超类的所有方法的编码样式来轻松缓解此问题。我在这里想念什么吗?

6
将对象映射到演示者的干净的OOP方法
我正在用Java创建一个棋盘游戏(例如国际象棋),其中每个棋子都是自己的类型(例如Pawn,Rook等等)。对于应用程序的GUI部分,我需要为每个这些部分提供一个图像。既然做的像 rook.image(); 违反了UI和业务逻辑的分离,我将为每个作品创建一个不同的演示者,然后将作品类型映射到其相应的演示者,例如 private HashMap<Class<Piece>, PiecePresenter> presenters = ... public Image getImage(Piece piece) { return presenters.get(piece.getClass()).image(); } 到目前为止,一切都很好。但是,我认为谨慎的OOP专家在调用getClass()方法时会皱眉,并建议像这样使用访客: class Rook extends Piece { @Override public <T> T accept(PieceVisitor<T> visitor) { return visitor.visitRook(this); } } class ImageVisitor implements PieceVisitor<Image> { @Override public Image visitRook(Rook rook) { return rookImage; } } 我喜欢这种解决方案(谢谢您,老师),但是它有一个明显的缺点。每次将新的样片类型添加到应用程序时,都需要使用新的方法来更新PieceVisitor。我想将我的系统用作棋盘游戏框架,可以通过一个简单的过程添加新作品,其中框架的用户只能提供作品及其演示者的实现,并将其插入框架中即可。我的问题:是否有没有等等的干净的OOP解决方案instanceof,getClass()它将允许这种可扩展性?

4
大班单责任
我有一个2500行Character类: 跟踪游戏中角色的内部状态。 加载并保持该状态。 处理大约30个传入命令(通常=将它们转发到Game,但是一些只读命令会立即得到响应)。 从Game正在采取的行动和他人的相关行动中收到约80个电话。 在我看来,这Character只有一个责任:管理角色的状态,在传入的命令和游戏之间进行调解。 还有其他一些职责已经分解: Character具有Outgoing调用的,以为客户端应用程序生成传出更新。 Character有一个Timer跟踪下一次允许它做某事的时间。对此验证了传入的命令。 所以我的问题是,在SRP和类似原则下拥有如此大的课程是否可以接受?是否有任何最佳实践来减轻它的麻烦(例如,将方法拆分为单独的文件)?还是我错过了一些东西,真的有很好的方法将其拆分吗?我意识到这是非常主观的,希望获得其他人的反馈。 这是一个示例: class Character(object): def __init__(self): self.game = None self.health = 1000 self.successful_attacks = 0 self.points = 0 self.timer = Timer() self.outgoing = Outgoing(self) def load(self, db, id): self.health, self.successful_attacks, self.points = db.load_character_data(id) def save(self, db, id): db.save_character_data(self, health, self.successful_attacks, self.points) …

3
对于涉及接口的仿真来说,这是糟糕的OOP设计吗?
我正在设计自己的小OOP程序来模拟吸血鬼,狼,人类和卡车,并试图实现自己对接口的有限理解。 (我在这里仍然是抽象的,还没有代码实现,所以这是一个OOP设计的问题……我想!) 我在这些类之间寻找“共同行为”并将其实现为接口是否正确? 例如,吸血鬼和狼咬人……那么我应该有一个咬人界面吗? public class Vampire : Villain, IBite, IMove, IAttack 同样对于卡车... public class Truck : Vehicle, IMove 对于人类... public class Man : Human, IMove, IDead 我的想法在这里吗?(感谢您的帮助)

4
C结构的行为可以像具有功能一样吗?
我struct在结构可以有成员但没有函数的地方使用C和s。为简单起见,假设我要为我命名的字符串创建一个结构,str并且我希望能够在str.replace(int i, char c)哪里完成i该操作,该操作是字符串的索引,也是c替换位置上的字符的字符i。因为结构体没有功能,或者我们仍然可以通过某种方式实现这种行为并模仿结构体可以具有(简单)功能的事实,这实际上仅仅是结构体将自身复制到新结构体并更新其结构体,所以这将永远不可能吗?字段,它可以做什么? 因此,replace可能是该结构的第三个成员,该成员指向一个新的结构,该新结构在访问或类似的操作时会更新。能做到吗?还是有些内在的东西或某种理论或范例阻止了我的意图? 背景是我正在编写C代码,并且发现自己正在重新发明一些我所知道的函数,这些函数是OOP语言中的内置库,而OOP将是一种处理字符串和命令的好方法。

3
由于什么原因,您会为Swift中的每个委托使用单独的类扩展?
我正在阅读Ray Wenderlich教程,并且注意到作者使用类扩展来保存委托回调,而不是让它们在类本身中进行处理,即: 类扩展内的委托回调: extension LogsViewController : UIPopoverPresentationControllerDelegate { func adaptivePresentationStyleForPresentationController(controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { ... } } 而不是将其包含在类中: 在类内委托回调: class LogsViewController : UITableViewController, UIPopoverPresentationControllerDelegate { func adaptivePresentationStyleForPresentationController(controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { ... } } 我同时发现这很奇怪也很有趣。他有一个专门用于LogsViewController类的扩展的文件,名为“ LogsViewControllerExtension.swift”,并且每个委托协议都有一个不同的扩展名:UITableViewDataSource,UISplitViewDelegate等,即: 多个类扩展,每个都有自己的文件中的委托回调: extension LogsViewController: UISplitViewControllerDelegate { ... callbacks } extension LogsViewController …

6
质疑依赖关系注入框架的论点之一:为什么创建对象图很难?
像Google Guice这样的依赖注入框架为其使用(来源)提供了以下动机: 要构造一个对象,首先要建立它的依赖关系。但是要构建每个依赖项,您需要其依赖项,依此类推。因此,在构建对象时,确实需要构建对象图。 手工构建对象图是劳动密集型(...),并且使测试变得困难。 但是我不赞成这种观点:即使没有依赖注入框架,我也可以编写易于实例化且易于测试的类。例如,Guice动机页面中的示例可以用以下方式重写: class BillingService { private final CreditCardProcessor processor; private final TransactionLog transactionLog; // constructor for tests, taking all collaborators as parameters BillingService(CreditCardProcessor processor, TransactionLog transactionLog) { this.processor = processor; this.transactionLog = transactionLog; } // constructor for production, calling the (productive) constructors of the collaborators public BillingService() …

6
如何练习面向对象的编程?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 6年前关闭。 已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 我一直使用过程语言进行编程,目前正朝着面向对象的方向发展。我面临的主要问题是我看不到一种有效地练习面向对象的方法。我会解释我的观点。当我学习PHP和C时,它很容易实现:只是选择一些东西并考虑该东西的算法。 例如,在PHP中,坐下来思考是一件很重要的事情:“好吧,为了练习,让我在一个可以添加产品的管理区域构建一个应用程序”。这非常简单,只需考虑一种算法即可注册一些用户,登录该用户并添加产品。结合使用这些功能和PHP功能,这是练习的好方法。 现在,在面向对象方面,我们还有很多其他东西。这不仅仅是考虑算法的问题,还包括更深入地分析需求,编写用例,弄清楚类图,属性和方法,设置依赖注入以及许多其他事情。 要点是,在我学习面向对象的方式中,一个好的设计似乎至关重要,而在过程语言中,一个模糊的想法就足够了。我并不是说在过程语言中我们可以不用设计就可以编写好的软件,只是为了实践而可行,而在面向对象的情况下,即使没有实践也要经过良好的设计似乎是不可行的。 这似乎是一个问题,因为如果每次我要练习时,我都需要弄清大量的需求,用例等,这似乎并不是提高对象定向的好方法,因为这需要每次练习时,我对应用程序都有一个完整的想法。 因此,练习面向对象的好方法是什么?

6
哪些功能特性值得为它们带来的好处感到困惑?
在使用Haskell和F#学习了函数式编程之后,OOP范例似乎在类,接口和对象方面倒退了。我的同事可以理解FP的哪些方面?是否有任何FP风格值得与我的老板谈谈对我的团队进行再培训,以便我们可以使用它们? FP的可能方面: 不变性 部分应用和咖喱 一流的功能(功能指针/功能对象/策略模式) 惰性评估(和Monad) 纯功能(无副作用) 表达式(相对于语句-每行代码都会产生一个值,而不是引起副作用,或者除了引起副作用之外) 递归 模式匹配 它是一种免费的所有人,我们可以在编程语言支持的范围内做任何事情吗?还是有更好的指南?

4
Rails:德米特混乱法则
我正在阅读一本名为《 Rails反模式》的书,他们谈论使用委派来避免违反Demeter法则。这是他们的主要例子: 他们认为在控制器中调用这样的命令是不好的(我同意) @street = @invoice.customer.address.street 他们提出的解决方案是执行以下操作: class Customer has_one :address belongs_to :invoice def street address.street end end class Invoice has_one :customer def customer_street customer.street end end @street = @invoice.customer_street 他们说,由于您仅使用一个点,因此您没有违反Demeter定律。我认为这是不正确的,因为您仍在通过客户通过地址来获取发票的街道。我主要是从我读过的博客文章中得到这个想法的: http://www.dan-manges.com/blog/37 在博客文章中,主要的例子是 class Wallet attr_accessor :cash end class Customer has_one :wallet # attribute delegation def cash @wallet.cash end end …

1
为什么命令式编程比函数式编程更受青睐?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 背景:我是函数式编程的支持者,他在VB.NET商店工作,那里的主流思维模型是命令式编程。作为我们系统的基础是WinForms,我可以理解我们不会完全摆脱命令式编程,但是我仍然尽可能尝试使用FP(主要是通过Linq),因为我相信它的优点。 针对FP的争论和反议 可能会注意到,流利的Linq效率不如命令式效率高,因为这种样式将一个序列处理为另一个序列并重复该序列。通常,与命令式方法相比,它需要花费更多的遍数,而命令式方法可以更好地进行优化以避免序列中的重复遍历。因此,主管无法理解为什么我会选择一种明显“效率较低”的功能方法。 反对意见:我认为尽管有时它在CPU周期方面效率较低,但我认为它更人性化且易于理解,因为每一行在序列中仅做一件事。在我看来,这就像一条装配线,每个人在他的工作岗位上只能做一份工作。我觉得效率的微不足道的折衷通过代码的关注点得到了很好的补偿。 我在商店里听到的另一个反对FP的论点是,调试起来更困难-是的。跳过Linq代码并不容易。而且我有时确实必须解开方法链,以便更好地关注和剖析我无法立即发现的问题。 _Counter-argument:尽管在大多数情况下我对此没有疑问,因为我认为函数样式在其读取方式以及函数链中引发错误时更具声明性,我通常可以立即发现问题。 我的问题 我一直在尝试在我们的商店中推广实用风格,但我觉得自己没有取得进展。我已经完成了两种编程风格,直到最近才涉足Haskell。尽管有多年的命令性经验,但是现在我在JavaScript中常规使用FP,但在我看来,它已经发展起来。当我将它与如果我坚持命令式风格时可能会做的事情进行比较时,它在我的核心中留下了正确的音符。我已经对功能思维,功能组成进行了重新训练。 我无法理解的是,要说服其他人相信FP的优点是多么困难。 例如,我店里的开发人员确实使用Linq,但是我认为他们通常在处理域数据的上下文中使用它。我在更一般的意义上使用它,并且在我处理序列/列表或持久性数据结构时更喜欢它。我无法说服我的队友扩大对Linq的使用。 我想了解的是导致开发人员不喜欢FP的原因。 我想从一个对FP有丰富经验但决定采用命令式风格的人那里得到一个答案。是什么驱使我们决定必须使用命令而不是使用功能? 这是另一个示例,重点介绍了命令式和函数式编程之间的区别。 我SelectedRows在Linq中这样写了网格的方法: Public Property SelectedRows() As DataRow() Implements IDataSourceControl.SelectedRows Get Return Me.ugrBase.Selected.Rows. OfType(Of Infragistics.Win.UltraWinGrid.UltraGridRow)(). Select(Function(ugr) ugr.ListObject). OfType(Of DataRowView)(). Select(Function(drv) drv.Row). ToArray End Get 但是,这种代码风格使我们的一些开发人员感到不舒服,因此我们的领导将其改写为更加熟悉的代码: Public Property SelectedRows() As DataRow() Implements IDataSourceControl.SelectedRows Get Dim plstRows As …


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.