Questions tagged «object-oriented»

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

7
规避巫师和战士中的规则
在这一系列博客文章中,Eric Lippert使用向导和战士作为示例描述了面向对象设计中的问题,其中: abstract class Weapon { } sealed class Staff : Weapon { } sealed class Sword : Weapon { } abstract class Player { public Weapon Weapon { get; set; } } sealed class Wizard : Player { } sealed class Warrior : Player { } 然后添加一些规则: 战士只能使用剑。 向导只能使用人员。 …

3
接口依赖于具体类是否可以?
我在Java中为自定义错误处理程序创建接口。 想要传递一个参数错误对象,但我需要它成为Exception类的子对象。 在接口中使用我定义的类名可以吗? 就不依赖于任何实现而言,这是否会使它减少接口的数量? 我尝试做这样的事情: public class CustomException { /* ... Implementation ... */ } public interface Interface { void onError(CustomException ex); }

1
出于设计原因,与Ruby或Smalltalk相比,Python的连接似乎不关注连接的项目,而是关注符号。
我认为OOP的基础之一是,我们有对象,这是我们有兴趣处理的项目,然后我们向它们发送消息。 因此,看起来很自然,我有一组项目,并且需要将它们放入一个字符串中,因此可以这样做: ["x", "o", "o"].join(" | ") # joining a tic-tac-toe row in Ruby (Smalltalk的操作方式与此相同)。" | "在某种程度上,它被认为是一个参数,是如何加入的一个象征。它可以是" "也一样,如果游戏板是要简单。因此,联接元素" | "并不是我们特别感兴趣的东西,也不是程序中的主要对象具有特别的重要性或意义。 如果Python使用 " | ".join(["x", "o", "o"]) 确实感觉有点奇怪,几乎感觉就像我们在向论点传递消息,以告诉论点某些事情。也许Python更具程序性?告诉连接字符串为我们执行一些职责? 是否保存实现,以便我们不必join为每个集合类定义一个?但是我们是否也可以为任何集合类编写一次(例如在Ruby中)不是真的吗? module Enumerable def my_join(joiner) self.inject {|a,b| a.to_s + joiner + b.to_s} end end (类似这样,调用to_s每个项目,依靠to_s每个类的做自己的事情,转换为字符串,然后将它们串联)。因此,我们不必为String,Hash或Set或我们拥有的任何集合类中的每一个实现。 还是Python出局不走OOP路线?它采用len("abc")和type([])替代"abc".len()或者[].type()甚至在Python3也似乎。Python是出于设计原因这样做吗?

2
接口隔离原理:如果接口存在大量重叠该怎么办?
摘自敏捷软件开发,原理,模式和实践:Pearson新国际版: 有时,由不同客户端组调用的方法会重叠。如果重叠很小,则组的接口应保持分离。公用功能应在所有重叠的接口中声明。服务器类将从每个接口继承通用功能,但仅实现一次。 鲍伯叔叔,谈论有微小重叠的情况。 如果出现大量重叠该怎么办? 说我们有 Class UiInterface1; Class UiInterface2; Class UiInterface3; Class UiIterface : public UiInterface1, public UiInterface2, public UiInterface3{}; 如果UiInterface1和之间有大量重叠,该UiInterface2怎么办?

2
为什么使用UML图计划代码的组织方式不合适?
因此,是的,图表有时可能不合适。什么时候不合适?当您创建没有代码的代码来验证它们时,然后打算遵循它们。绘制图表探索想法没有错。 敏捷软件开发:原理,模式和实践 -Robert C. Martin 他到底是什么意思?UML是否旨在帮助计划如何在 “切入” 之前构造代码?如果您不遵循自己想到的图,使用它有什么意义? 上下文:在本章中,鲍伯叔叔为保龄球比赛的得分保持者制作了一个UML图。然后,他继续以测试驱动的方式开发程序,而无需查阅UML图。生成的程序与UML图完全不同,鲍勃叔叔得出了上面引用的结论。


4
如何在不强制进行层次结构的情况下使对象彼此交互和通信?
我希望这些问题能使我的问题更清楚-但是,我完全理解它们是否愿意,所以请让我知道是否是这种情况,然后我将尝试使自己更加清楚。 认识BoxPong,这是我做的非常简单的游戏,以熟悉面向对象的游戏开发。拖动框以控制球并收集黄色的东西。 制作BoxPong可以帮助我提出一个基本问题:除其他事项外,我如何才能具有相互交互的对象?换句话说,有没有一种方法使对象不是分层的而是共存的?(我将在下面进一步详细介绍。) 我怀疑对象共存的问题是一个普遍的问题,因此我希望有一个既定的解决方法。我不想重新发明方形齿轮,因此我想寻找的理想答案是“这是一种通常用于解决您的问题的设计模式”。 尤其是在像BoxPong这样的简单游戏中,很明显,在同一级别上存在或应该存在少量对象。有一个盒子,有一个球,有一个收藏品。我可以用面向对象的语言表达的所有内容,尽管看起来似乎都是严格的HAS-A关系。这是通过成员变量完成的。我不能只是开始ball并让它做它的事情,我需要它永久地属于另一个对象。我已经设定,使游戏的主要对象有一个箱子,并依次盒子有一个球,并有一个比分反超。每个对象也都有一个update()方法,该方法计算位置,方向等,我走了类似的方法还有:我所说的主要游戏对象的更新方法,它调用了所有儿童的更新方法,它们依次调用所有的更新方法他们的孩子。这是我看到的制作面向对象游戏的唯一方法,但我认为这不是理想的方法。毕竟,我不会完全把球看作是属于盒子的东西,而是要处于同一水平并与之交互。我想可以通过将所有游戏对象都转换成主要游戏对象的成员变量来实现,但是我看不出有什么解决方法。我的意思是……撇开明显的混乱,如何让球和盒子互相认识,也就是互动? 还存在对象之间需要传递信息的问题。我有很多为SNES编写代码的经验,您几乎一直可以访问整个RAM。假设您要为Super Mario World定制敌人,并且希望它删除Mario的所有硬币,然后只存储零以解决$ 0DBF,这没问题。没有任何限制说敌人无法访问玩家的状态。我想我被这种自由宠坏了,因为对于C ++之类的东西,我经常发现自己在想如何使其他对象(甚至全局对象)可以访问值。 以BoxPong为例,如果我希望球从屏幕边缘弹起怎么办?width和height是的属性Game类,ball可以访问它们。我可以传递这些类型的值(通过构造函数或需要它们的方法),但是这只是对我的不好的做法。 我想我的主要问题是我需要对象彼此了解,但是我看到的唯一方法是严格的层次结构,这是丑陋且不切实际的。 我听说过C ++上的“朋友类”,并且知道它们是如何工作的,但是如果它们是最终解决方案,那么为什么我看不到friend每个C ++项目中都充斥着关键字呢?并不是每种OOP语言都存在这个概念吗?(我最近才了解到的函数指针也是如此。) 预先感谢您提供任何形式的答案-再次提醒您,如果有部分内容对您没有意义,请告诉我。

5
用Java“编程到接口”总是有意义吗?
我已经看到了在这个问题上有关如何实例化从接口实现的类的讨论。就我而言,我正在用Java编写一个很小的程序,该程序使用的实例TreeMap,并且根据那里的每个人的看法,应将其实例化为: Map<X> map = new TreeMap<X>(); 在我的程序中,我正在调用函数map.pollFirstEntry(),该函数未在Map接口中声明(并且在Map接口中也存在其他几个声明)。我设法通过将其转换为一个TreeMap<X>我称之为以下方法的地方来做到这一点: someEntry = ((TreeMap<X>) map).pollFirstEntry(); 我了解上述针对大型程序的初始化准则的优点,但是对于很小的程序(该对象不会传递给其他方法),我认为这是不必要的。尽管如此,我还是在工作应用程序中编写此示例代码,但我不希望我的代码看起来很糟也不混乱。什么是最优雅的解决方案? 编辑:我想指出的是,我对广泛的良好编码实践而不是特定功能的应用更感兴趣TreeMap。正如一些答案已经指出的那样(我已经标记为第一个回答),应该使用更高的抽象级别,而又不会失去功能。

4
访客模式在这种情况下有效吗?
我任务的目标是设计一个可以运行计划的定期任务的小型系统。重复执行的任务类似于“星期一至星期五,从上午8:00到下午5:00,每小时发送一封电子邮件给管理员”。 我有一个名为RecurringTask的基类。 public abstract class RecurringTask{ // I've already figured out this part public bool isOccuring(DateTime dateTime){ // implementation } // run the task public abstract void Run(){ } } 我有几个从RecurringTask继承的类。其中之一称为SendEmailTask。 public class SendEmailTask : RecurringTask{ private Email email; public SendEmailTask(Email email){ this.email = email; } public override void Run(){ …

8
面向对象与算法之间的关系
当我阅读一些算法教科书时,它们充满了解决某些问题(排序,最短路径)或某些常规方法(递归算法,除以征服,动态编程等)的巧妙程序。我在那里发现了很少的面向对象编程的痕迹。(为什么它们更面向过程?)。 然后我在想: 算法和OOP之间有什么关系?他们是两个独立的主题吗? 是否存在一些只能由OOP提出和解决的问题? OOP如何帮助算法?或会在哪个方向影响它?

5
OOP语言和类型的类
在编程语言理论中,类型是一组值。例如,类型“ int”是所有整数值的集合。 在OOP语言中,类是类型,是吗? 当一个类定义了一个以上的成员时,例如 class myclass{ int a; double b; } 当我们谈论课程时,我们的意思是 “ (a,b)哪里a是一个整数,并且b是一个双精度数”,或者 “ { (x,y)| x是整数,y是双精度}”吗? 实例myclass是什么意思? “ (a,b)哪里a是一个整数,并且b是一个双精度数”,或者 一个对象,该对象占用一个内存空间,并且可以(不一定是空)可以存储对象(x,y),xint 在哪里,ydouble在哪里?

4
修改自身后,类的方法何时应返回相同的实例?
我有一个具有三个方法的类A(),B()并且C()。这些方法修改了自己的实例。 当实例必须是一个单独的副本时,方法必须返回一个实例(与一样Clone()),但是在修改方法中的同一实例而不返回任何其他值时,我可以自由选择返回void还是相同的实例(return this;)。 在决定返回相同的修改实例时,我可以进行整洁的方法链,例如obj.A().B().C();。 这是这样做的唯一理由吗? 修改自己的实例并返回它还可以吗?还是应该只返回副本并像以前一样保留原始对象?因为当返回相同的修改实例时,用户可能会假定返回的值是副本,否则将不会返回?如果可以的话,在方法中阐明此类问题的最佳方法是什么?

6
大量的时间,我想不出拥有对象而不是静态类的理由。对象有比我想象的更多的好处吗?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 我了解对象的概念,作为Java程序员,我觉得OO范式在实践中自然而然地出现在我身上。 但是最近我发现自己在想: 等等,使用对象比使用静态类(具有适当的封装和OO做法)实际具有哪些实际好处? 我可以想到使用对象的两个好处(既重要又强大): 多态性:允许您在运行时动态灵活地交换功能。还可以轻松为系统添加新功能“零件”和替代品。例如,如果有一个Car设计用于处理Engine对象的类,并且您想向Car可以使用的系统中添加一个新的Engine,则可以创建一个新的 Engine子类并将该类的Car对象简单地传递给该 对象,而不必改变一切Car。您可以在运行时决定这样做。 能够“传递功能”:您可以动态地在系统中传递对象。 但是与静态类相比,对象还有更多优势吗? 通常,当我向系统添加新的“部件”时,我会通过创建新类并从中实例化对象来实现。 但是最近,当我停下来想一想时,我意识到在很多我通常使用对象的地方,静态类将与对象相同。 例如,我正在为我的应用程序添加一个保存/加载文件机制。 对于一个对象,代码的调用行将如下所示: Thing thing = fileLoader.load(file); 对于静态类,它看起来像这样: Thing thing = FileLoader.load(file); 有什么不同? 通常,当普通的静态类的行为相同时,我只是想不出实例化对象的理由。但是在OO系统中,静态类很少见。所以我一定想念一些东西。 除了上面列出的两个对象以外,对象还有其他优点吗?请解释。 编辑:澄清。在交换功能或传递数据时,我确实发现对象非常有用。例如,我写了一个组成旋律的应用程序。MelodyGenerator有几个不同的子类创建旋律,并且这些类的对象是可互换的(策略模式)。 旋律也是对象,因为传递它们很有用。和弦和音阶也是如此。 但是,系统的“静态”部分又将如何传递呢?例如-一种“保存文件”机制。为什么要在对象而不是静态类中实现它?

9
在不同的编程语言上学习OOP有什么区别吗?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 6年前关闭。 我想学习OOP。我了解Python,但对OOP知之甚少。 但是,当我在论坛上搜索“ learning OOP”时,我看到一个家伙在说:“ Python太新了,这就是为什么您不能在Python上学习OOP的原因。应该先学习Java,然后再理解Java上的OOP”。 是真的吗 在不同的编程语言上理解OOP有什么区别吗?喜欢在Java,C#,C ++,Perl或Python上学习它?

4
.NET编程和POCO类
今晚我在思考需要更改的某些应用程序时思考了一下,这让我开始思考。实体框架实体是POCO(普通的旧CLR对象),而ASP.NET MVC中使用的模型通常也是POCO。这基本上意味着仅属性,没有方法。 现在,OO编程通常允许对象封装其功能,包括其属性和方法,这允许多态发生。随着使用POCO类的兴起,通用存储库之类的设计模式变得越来越流行。过去,当我的对象有自己的CRUD操作时,现在将它们放在存储库中。 这仅仅是OO的发展而已,它从对象中删除了CRUD操作以使它们解耦,或者CRUD操作过去不应该处于对象级别,而我错了吗?哎呀,也许两者都是合法的,而且一直都是。这只是一个让我思考的观察,所以我想寻求其他意见。

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.