Questions tagged «object-oriented»

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

9
多态性在现实世界中如何使用?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 去年关闭。 我试图了解在现实生活中的项目中如何使用多态,但是我只能找到经典的示例(或类似的例子),该示例具有一个Animal带方法的父类speak(),以及许多重写此方法的子类,现在您可以speak()在任何子对象上调用该方法,例如: Animal animal; animal = dog; animal.speak(); animal = cat; animal.speak();

7
为什么按原样创建实例?
在过去六个月的时间里,我已经学习了C#,现在正在研究Java。我的问题是关于实例创建(实际上是用两种语言)的问题,而更多的是:我想知道为什么他们这样做了。举个例子 Person Bob = new Person(); 是否有理由两次指定对象?会不会有something_else Bob = new Person()? 如果我遵循惯例,似乎会更像: int XIsAnInt; Person BobIsAPerson; 也许是其中之一: Person() Bob; new Person Bob; new Person() Bob; Bob = new Person(); 我想我很好奇是否有比“这就是完成的方式”更好的答案。

4
为什么使用接口(例如Map)而不是实现(HashMap)来定义Java对象
在大多数Java代码中,我看到人们这样声明Java对象: Map<String, String> hashMap = new HashMap<>(); List<String> list = new ArrayList<>(); 代替: HashMap<String, String> hashMap = new HashMap<>(); ArrayList<String> list = new ArrayList<>(); 为什么偏爱使用接口而不是实际使用的实现来定义Java对象?

5
何时使用接口(单元测试,IoC?)
我怀疑我在这里犯了一个小学生错误,正在寻求澄清。我的解决方案(C#)中有很多类-敢于说大多数-我最终为之编写了相应的接口。例如,即使我永远不可能用其他实现替换该计算器,也可以使用“ ICalculator”接口和实现该接口的“ Calculator”类。而且,这些类中的大多数与其依赖项都位于同一个项目中-实际上,它们仅需为internal,但最终成为public实现其各自接口的副作用。 我认为这种为所有内容创建接口的做法源于一些谬误: 1)我本来以为创建单元测试模拟必须有一个接口(我使用的是Moq),但是后来我发现,如果类的成员为virtual,则可以模拟该类,并且该类具有无参数的构造函数(如果我错了)。 2)我本来以为必须要有一个接口才能向IoC框架(Castle Windsor)注册一个类,例如 Container.Register(Component.For<ICalculator>().ImplementedBy<Calculator>()... 实际上,我可以针对自身注册具体类型: Container.Register(Component.For<Calculator>().ImplementedBy<Calculator>()... 3)使用接口(例如,用于依赖项注入的构造函数参数)会导致“松散耦合”。 那我对接口发疯了吗?!我知道您通常会“使用”接口(例如公开公共API)或“可插入”功能之类的场景。我的解决方案只有少数适​​合此类用例的类,但我想知道是否所有其他接口都是不必要的,应该删除?关于上述第3点,如果这样做,我是否会违反“松散耦合”? 编辑:-我只是在玩Moq,它似乎要求方法是公共的和虚拟的,并具有公共的无参数构造函数,以便能够模拟它们。这样看来我不能拥有内部类了吗?

6
鸭子是否正在输入多态性的子集
从WIkipedia上的多态 在计算机科学中,多态是一种编程语言功能,它允许使用统一的界面来处理不同数据类型的值。 从维基百科上的鸭子打字 在使用面向对象的编程语言进行的计算机编程中,鸭子类型是一种动态类型的类型,其中对象的当前方法和属性集确定有效的语义,而不是其从特定类或特定接口的实现继承。 我的解释是,基于鸭子的类型,对象的方法/属性确定了有效的语义。这意味着对象的当前形状决定了它所坚持的界面。 从多态性可以说,如果一个函数接受多种不同的数据类型,只要它们支持一个接口,则该函数就是多态的。 因此,如果一个函数可以忽略类型,则它可以接受多种不同的数据类型并对其进行操作,只要这些数据类型具有正确的方法/属性并因此维护接口即可。 (术语“接口”的使用不是作为代码结构,而是作为描述性的文档结构)。 鸭型与多态性的正确关系是什么? 如果一种语言可以鸭式输入,是否意味着它可以做到多态?

5
SRP(单一责任原则)是客观的吗?
考虑两个想要设计“吸引用户”设计的UI设计师。“吸引用户”是一个不客观的概念,仅存在于设计师的脑海中。因此,设计师A可以选择红色,而设计师B可以选择蓝色。设计器A创建的布局与设计器B完全不同,依此类推。 我读到有关SRP(单一责任原则)的知识,我理解的是一种主观分析或对职责的分解,这些职责可能因OO设计者而异。我对吗?换句话说,是否有可能有两个优秀的面向对象的分析器和设计人员针对一个基于SRP原理的系统提出两种不同的设计?

5
向经验丰富的C ++工程师团队“引入” OOP / OOD的最佳方法
我正在寻找一种有效的方法来向现有团队成员介绍OOP概念,但这并不是侮辱。我的队友对OO语言并不陌生。我们从事C ++ / C#已有很长时间了,因此对技术本身很熟悉。 但是,我环顾四周,并且没有付出很大的努力(主要是以代码审查的形式),似乎我们正在生成的是恰巧在类内部的C代码。仅举几例,几乎没有使用单一责任原则,抽象或试图最小化耦合的尝试。我见过没有构造函数的类,但每次实例化时将memset设置为0。 但是每次我提起OOP时,每个人都会点头并让他们看起来好像完全知道我在说什么。知道这些概念是件好事,但在交付实际工作时,我们(比其他人更多)似乎很难应用它们。 代码审查非常有帮助,但是代码审查的问题在于它们仅在事实发生之后发生,因此对于某些人来说,我们似乎最终重写了刚刚编写的代码(它大部分是重构的,但仍然要花费很多时间)。另外,代码审查仅提供反馈给单个工程师,而不是整个团队。 我正在做一个演示文稿(或一系列)的想法,然后尝试再次提出OOP以及一些本来可以编写得更好并且可以重构的现有代码示例。我可以使用一些没有人拥有的非常老的项目,因此至少那部分不应该是一个敏感的问题。但是,这行得通吗?正如我所说的,大多数人已经做过C ++很久了,所以我的猜测是:a)他们会坐在那里思考为什么我要告诉他们他们已经知道的东西; b)他们实际上可能会将它当作侮辱,因为我告诉他们他们不知道如何做他们已经从事多年甚至数十年的工作。 是否有另一种方法可以比代码审查更广泛地吸引读者,但同时又不会像惩罚性演讲那样? 我不是一个刚大学毕业的孩子,他对理想的代码设计有着乌托邦式的理想,我不希望任何人都能做到。我之所以写这本书,是因为我只是对一个实际上在纸上有不错的高级设计的人进行了评论。但是,如果您描绘类:A-> B-> C-> D,则在代码B,C和D中都实现几乎相同的公共接口,并且B / C具有一个内联函数,因此最高级的A类绝对在做所有工作(包括内存管理,字符串解析,设置协商...)主要以4种mongo方法进行,并且出于所有目的和目的,几乎都直接调用了D。 更新:我是一名技术负责人(担任该职位六个月),并得到了小组经理的全力支持。我们正在开发非常成熟的产品,并且维护成本绝对是众所周知的。

6
方法链接与封装
方法链接与“单访问点”方法存在经典的OOP问题: main.getA().getB().getC().transmogrify(x, y) 与 main.getA().transmogrifyMyC(x, y) 第一个优点似乎是,每个类仅负责较小的一组操作,并使所有事情都变得更加模块化 -向C添加方法不需要A,B或C花费任何精力来公开它。 当然,不利的一面是较弱的封装,第二种代码可以解决此问题。现在,A可以控制通过它的每个方法,并且可以根据需要将其委派给它的字段。 我意识到没有单一的解决方案,它当然取决于上下文,但是我真的很想听听有关两种样式之间其他重要区别的意见,在什么情况下我应该选择其中任何一种-因为现在,当我尝试设计一些代码,我觉得我只是在不使用参数来决定一种方法。

11
是什么使面向对象编程成功?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 您认为使面向对象编程取得如此巨大成功的功能是什么? 讯息传递 遗产 多态性 封装形式 或您可能要介绍的其他功能。 我也想知道抽象数据类型和面向对象编程之间的联系是什么?


4
为什么在Java中没有“仅子类”访问修饰符?
在Java中,方法有四个可用的访问修饰符: public -任何类都可以使用此方法。 protected -同一包中的类和任何包中的子类都可以使用此方法。 private -只有此类可以使用此方法。 no modifier (“包私有”)-只有同一包中的类才能使用此方法。 经常发生的事情是,我想在超类中拥有所有子类都可以使用的有用方法。但是其他类访问此方法没有任何意义,从某种意义上说,它将破坏封装。 因此,我必须在超类publicor中声明这些有用的方法protected,这至少在包中将它们公开给所有其他类。即使它们仅打算由子类使用。 有没有理由subclasses-only在Java中没有访问修饰符?对我来说似乎很奇怪。我想念什么吗? 同样,subclasses-only当您只想将变量公开给子类时,访问修饰符也很有用。在我身上发生的事情很多。

6
枚举什么时候不是代码气味?
困境 我已经阅读了很多有关面向对象实践的最佳实践书籍,几乎我读过的每一本书都有一部分内容,他们说枚举是一种代码味道。我认为他们已经错过了解释枚举何时有效的部分。 因此,我正在寻找准则和/或用例,其中枚举不是代码的味道,而实际上是有效的构造。 资料来源: “根据经验,枚举是代码的味道,应将其重构为多态类。[8]” Seemann,Mark,依赖注入,.Net,2011年,第2页。342 [8] Martin Fowler等人,《重构:改进现有代码的设计》(纽约:Addison-Wesley,1999年),第82页。 语境 我陷入困境的原因是交易API。通过以下方法,他们给了我Tick数据流: void TickPrice(TickType tickType, double value) 哪里 enum TickType { BuyPrice, BuyQuantity, LastPrice, LastQuantity, ... } 我尝试过围绕该API进行包装,因为打破更改是该API的生活方式。我想跟踪包装器上最后收到的刻度线类型的值,并且通过使用ticktypes字典来做到这一点: Dictionary<TickType,double> LastValues 在我看来,如果将它们用作键,这似乎是对枚举的正确使用。但是我有第二个想法,因为我确实有一个地方可以根据这个集合做出决定,而且我想不出一种消除消除switch语句的方法,我可以使用一个工厂,但是那个工厂仍然会有一个在某处切换语句。在我看来,我只是在移动东西,但仍然闻起来。 找到枚举的不容易,但是要做到的却不那么容易,如果人们可以分享他们的专业知识,利弊,我将不胜感激。 第二个想法 有些决定和行动是基于这些决定和行动的TickType,我似乎想不出消除枚举/切换语句的方法。我能想到的最干净的解决方案是使用工厂并返回基于的实现TickType。即使那样,我仍然会有一个switch语句,该语句返回接口的实现。 下面列出的是示例类之一,在其中我怀疑自己可能使用的枚举错误: public class ExecutionSimulator { Dictionary<TickType, double> LastReceived; void ProcessTick(TickType tickType, double value) { //Store Last Received …

5
MVC:控制器是否违反了单一责任原则?
单一责任原则指出“班级应该有一个改变的理由”。 在MVC模式中,Controller的工作是在视图和模型之间进行中介。它为View提供了一个界面,以报告用户在GUI上进行的操作(例如,允许View调用controller.specificButtonPressed()),并且能够在Model上调用适当的方法,以操纵其数据或调用其操作(例如model.doSomething()) 。 这意味着: 控制器需要了解GUI,以便为“视图”提供合适的界面来报告用户操作。 它还需要了解模型中的逻辑,以便能够在模型上调用适当的方法。 这意味着有两个更改的原因:GUI的更改和商务逻辑的更改。 如果GUI发生更改,例如添加了新按钮,则控制器可能需要添加新方法,以允许视图报告用户对该按钮的按下情况。 而且,如果模型中的业务逻辑发生了变化,则控制器可能必须进行更改才能在模型上调用正确的方法。 因此,控制器有两个可能的变化原因。它会破坏SRP吗?

4
何时将公共字段移入基类?
我目前有两个派生类A和B,它们都有一个共同的字段,并且我试图确定它是否应该进入基类。 永远不会从基类中引用它,并且说如果在将来的某个时刻派生出另一个没有的类C,那么它不会_field1违反“最低特权”(或某些东西)的原则。是吗 public abstract class Base { // Should _field1 be brought up to Base? //protected int Field1 { get; set; } } public class A : Base { private int _field1; } public class B : Base { private int _field1; } public class C : Base { // …

2
序列化和反序列化应该由要序列化的类负责吗?
我目前处于C#.NET应用程序的几个模型类的(重新)设计阶段。(模型与MVC中的M相同)。模型类已经具有大量精心设计的数据,行为和相互关系。我正在将模型从Python重写为C#。 在旧的Python模型中,我认为我看到了疣。每个模型都知道如何进行序列化,而序列化逻辑与任何类的其余行为无关。例如,假设: Image类的.toJPG(String filePath) .fromJPG(String filePath)方法 ImageMetaData.toString()和.fromString(String serialized)方法的类。 您可以想象这些序列化方法与该类的其余部分之间是否没有凝聚力,但是只能保证该类知道足够的数据来对其自身进行序列化。 上课知道如何序列化和反序列化是一种常见的做法吗?还是我错过了通用模式?

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.