Questions tagged «object-oriented»

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


5
通过使用getter避免常量是一种好习惯吗?
用getter替换在类外部使用的常量是一种好习惯吗? 例如,使用if User.getRole().getCode() == Role.CODE_ADMIN还是更好if User.getRole().isCodeAdmin()? 这将导致此类: class Role { constant CODE_ADMIN = "admin" constant CODE_USER = "user" private code getRoleCode() { return Role.code } isCodeAdmin () { return Role.code == Role.CODE_ADMIN } isCodeUser () { return Role.code == Role.CODE_USER } }

6
接口包含以常量形式返回实现的具体类型的方法是否可以?
我经常会遇到需要不同的组件行为(取决于不同接口的具体类型)的情况。 为了说明我的问题,我写了一个小代码段,它将显示我的意思。在此示例中,我尝试从动物对象实例化食物对象。 interface Animal { void growl(); String getAnimalType(); //"DOG" or "FISH" } abstract class Food {} Meat extends Food {} Bread extends Food {} class FoodFactory { Food createFoodForAnimal(Animal animal) { switch (animal.getAnimalType()) { case "DOG": Food food = new Meat(); break; case "FISH": Food food = new Bread(); …

4
如何处理不可变字段上的setter?
我有一堂课有两个readonly int领域。它们作为属性公开: public class Thing { private readonly int _foo, _bar; /// <summary> I AM IMMUTABLE. </summary> public Thing(int foo, int bar) { _foo = foo; _bar = bar; } public int Foo { get { return _foo; } set { } } public int Bar { get { return …

8
我的顺序收集应该从索引0还是索引1开始?
我正在为具有多个通道的设备创建对象模型。客户和我之间使用的名词是Channel和ChannelSet。(“集合”在语义上不准确,因为它是有序的,而正确的集合不是。但这在不同的时间是个问题。) 我正在使用C#。这是一个用法示例ChannelSet: // load a 5-channel ChannelSet ChannelSet channels = ChannelSetFactory.FromFile("some_5_channel_set.json"); Console.Write(channels.Count); // -> 5 foreach (Channel channel in channels) { Console.Write(channel.Average); Console.Write(", "); } // -> 0.3, 0.3, 0.9, 0.1, 0.2 一切都是花花公子。 但是,客户端不是程序员,它们绝对会被零索引混淆-第一个通道是它们的通道1。但是,为了与C#保持一致,我想将ChannelSet索引从零开始。 当我的开发团队和客户进行交互时,这肯定会导致他们之间的脱节。但更糟糕的是,在代码库中如何处理此问题的任何不一致都是潜在的问题。例如,这是一个UI屏幕,最终用户(根据1个索引进行思考)正在编辑频道13: 该Save按钮最终将产生一些代码。如果ChannelSet索引为1: channels.GetChannel(13).SomeProperty = newValue; // notice: 13 或如果它的索引为零: channels.GetChannel(12).SomeProperty = newValue; // notice: 12 我不确定如何处理。我觉得这是个好习惯,即使有序的,整数索引的事物列表(ChannelSet)与C#Universe中的所有其他数组和列表接口保持一致(通过零索引ChannelSet)。但是,然后,UI和后端之间的每一段代码都需要翻译(减1),我们都知道隐患和常见的一对一错误已经是多么的隐秘。 …


5
用共享的编码范例就好像用语言Y编写程序一样,用语言X编写内容为什么不好?
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 不久前,我在SO上问了一些用C ++编写的东西,但是并没有得到解决这个问题的答案,而是对我的编码风格发了疯,即使当我指出这是WIP的一段代码时那是我打算在运行基本案例时清理它。(我的否决票太多了,因此我决定提出这个问题,因为我在SO上的代表已经非常糟糕了) 这让我想知道为什么人们会采取这样的强硬态度:“你是菜鸟,自己去他妈的”。我被指控像编写Java一样编写C ++。我无法理解的东西仍然让我感到困惑。 我已经用很多OOP语言编程了很多年了,尽管有时是间隔的。我会根据可用的库和最佳的执行环境选择要使用的语言。我在OOP代码中采用了设计模式,并且我非常有信心自己对模式的使用是正确的,并且在OO方面,我可以坚持自己的想法。我了解OOP工具箱,但仅在我认为确实需要时才选择使用这些工具,而不仅仅是使用整洁的技巧来展示我的编码才智。(我知道这不是一流的,但我认为也不是n00b级别)。 在写一行之前,我先设计代码。为了定义测试,我列出了某个类的目标及其必须遵守的测试标准。因为创建序列图然后编写代码对我来说比较容易,所以我选择在界面变得明显之后编写测试。 我必须承认,在我在问题中发布的代码段中,我仍在使用指针,而不是使用智能指针。我会尽可能使用RAII。我知道适当的RAII意味着要防范空指针,但是我会逐步工作。这是一项正在进行的工作,我打算稍后对其进行清理。强烈谴责这种工作方式。 我认为,首先应该有一个可行的示例,这样我才能确定基本案例是否是可行的思维方式。我也碰巧认为,在证明了基本情况之后,清理代码是敏捷重构阶段的典型操作。我必须承认,尽管我慢慢地了解Cxx标准,但我更喜欢使用自己了解的内容,而不是冒着使用尚未在生产代码中掌握的概念的风险。我偶尔会尝试一些新东西,但通常是在我为此而做的游戏项目中。 [edit]我想澄清一下,在我开始提出问题之前,我的搜索结果中并未显示的建议[1]。但是,尽管他的建议确实涵盖了该问题的一个方面,但他所链接的问题并没有回答我问题的核心,只是一部分。我的问题更多是关于我对编码风格的反应以及处理不同编码风格和(明显)技能水平的专业方面。关于我之前关于SO的问题,它就是一个恰当的例子。[/编辑] 然后的问题是:为什么嘲笑不使用您的编码风格的人? 我手头的事务/细分是: 如果重构使重构后的代码更健壮,为什么在原型情况下使用更多容易出错的代码将是不好的编程习惯呢? 用C ++编写的程序如何像用Java编写的一样?是什么使它成为不好的程序,(考虑到我指出了当前风格的意图以及计划中的改进工作)? 如果选择使用某种编程范例(例如OOP / DP)中使用的构造,我将如何成为一名糟糕的专业人员? [1] 快速发展,然后修正错误或缓慢,注意每一行代码?

4
为什么Java不使用某些类的封装?
我的问题与System.in和System.out类有关(可能还有其他类似标准库中的类)。这是为什么?在OOP中这不是不好的做法吗?它不应该被使用,如:System.getIn()和System.getOut()?我一直有这个问题,希望在这里能找到一个好的答案。

4
我应该如何向已存在的对象添加功能?
我有一个具有一定数量明确定义的功能的接口。比方说: interface BakeryInterface { public function createCookies(); public function createIceCream(); } 这对于大多数接口实现都很有效,但是在某些情况下,我需要添加一些新功能(例如,可能已添加到新方法中createBrownies())。这样做的显而易见/天真的方法是扩展接口: interface BrownieBakeryInterface extends BakeryInterface { public function createBrownies(); } 但是有一个很大的缺点,就是我不能在不修改现有API的情况下添加新功能(例如,更改类以使用新接口)。 我正在考虑使用适配器在实例化后添加功能: class BrownieAdapter { private brownieBakery; public function construct(BakeryInterface bakery) { this->brownieBakery = bakery; } public function createBrownies() { /* ... */ } } 这会让我感到类似: bakery = new …

5
如何将OOP概念应用于构建简单但真实的Web应用程序?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 我已经尝试了很长时间,将自己的头放在OOP上。我看到了它的优势。我阅读了很多很多教程,并观看了相同数量的有关该主题的视频。我得到了动物/猫/狗的例子,我得到了汽车/驱动器的例子。我苦苦挣扎的是如何在实际应用程序中应用这些概念。因此,我着手使用OOP构建一个。 我并不是在寻求语法或编写特定代码方面的帮助-我可以在文档中以及通过搜索论坛等方式找到自己。我真正需要的是一些指导,并时不时地朝着正确的方向发展。有经验丰富的程序员愿意指导我吗? 作为我的学习项目,我想构建一个简单的分类“ Web应用程序”。类似于Craigslist,但在范围方面被淡化。我想使用PHP5和MySQL,因为我对它们很熟悉。 假设只有以下两种用例: 发布要出售的东西 浏览/搜索要购买的东西 什么是事物“物”?我可以想象每个项目都可以是一个对象,但是在什么时候呢?又为什么呢 因此,例如,用户填写“待售物品”表格,该表格是否应该变成一个对象,然后传递给另一个将值插入数据库的对象? 当另一个用户正在浏览并要求查看C类的所有项目时该怎么办?是否有必要在应用程序必须连接到其数据库时创建一个数据库对象,然后获取一堆项目对象并将其显示在页面上,这是否有意义?……将其写出来无疑使我意识到我对OOP仍然一无所知。请帮我解决这个问题。 如果您认为这不是开始涉足OOP的好项目,请随时提出另一个想法!


4
阐明开放/封闭原则
正如我已经解释的那样,开放/封闭原则指出,一旦编写代码,就不应修改(除了错误修复)。但是,如果我的业务规则发生更改,我是否应该修改实现这些更改的代码?我怀疑我不了解该原理,因为这对我来说没有意义。

10
如果一个类属性创建并返回一个新的类实例,它是一种反模式吗?
我有一个叫做Heading一些事情的类,但它也应该能够返回当前标题值的反面,最后必须通过创建Heading类本身的新实例来使用它。 我可以使用一个简单的属性reciprocal来返回当前值的相反标题,然后手动创建Heading类的新实例,或者我可以创建一种方法createReciprocalHeading()来自动创建Heading类的新实例并将其返回给用户。 但是,我的一位同事建议我只创建一个名为的类属性reciprocal,该属性通过其getter方法返回该类本身的新实例。 我的问题是:类属性的行为不是一种反模式吗? 我特别觉得这不太直观,因为: 在我看来,类的属性不应返回类的新实例,并且 如果reciprocal没有从IDE获得帮助或检查getter签名,该属性的名称为,将无法帮助开发人员完全理解其行为。 我是否对类属性应该做的事情过于严格?还是真正的顾虑?我一直试图通过类的字段和属性来管理类的状态,并通过其方法来管理类的行为,而我却看不出它如何适合于类属性的定义。

5
我对显式强制转换运算符的使用是否合理?
我有一个大对象: class BigObject{ public int Id {get;set;} public string FieldA {get;set;} // ... public string FieldZ {get;set;} } 还有一个专门的,类似于DTO的对象: class SmallObject{ public int Id {get;set;} public EnumType Type {get;set;} public string FieldC {get;set;} public string FieldN {get;set;} } 我个人发现了将BigObject显式转换为SmallObject的概念-知道这是一种单向丢失数据的操作-非常直观且易读: var small = (SmallObject) bigOne; passSmallObjectToSomeone(small); 它使用显式运算符实现: public static explicit operator …

10
在OOP中似乎需要循环引用的现实活动建模的正确方法是什么?
我一直在努力解决Java项目中有关循环引用的问题。我正在尝试对现实世界中的情况进行建模,在这种情况下,所讨论的对象似乎是相互依赖的,并且需要彼此了解。 该项目是玩棋盘游戏的通用模型。基本类是非特定类,但已扩展为处理国际象棋,西洋双陆棋和其他游戏的特定类。11年前,我用六种不同的游戏将其编码为applet,但问题是它充满了循环引用。那时,我通过将所有相互交织的类填充到一个源文件中来实现它,但是我意识到这在Java中是不好的形式。现在,我想实现与Android应用类似的功能,并且我想正确地执行操作。 这些类是: RuleBook:可以针对诸如棋盘的初始布局,其他初始游戏状态信息(例如谁先移动,可用的移动,可用的移动,提议的移动后游戏状态发生了什么)等问题进行询问的对象。当前或提议的董事会职位。 棋盘:游戏棋盘的简单表示,可以指示其反映移动。 MoveList:移动列表。这是双重目的的:在给定的位置选择可用的动作,或者在游戏中进行的动作列表。它可以分为两个几乎相同的类,但这与我要问的问题无关,并且可能会使它进一步复杂化。 搬家:一招。它以原子列表的形式包含了有关移动的所有内容:从这里拿起一块,放到那里,从那里取出被捕获的一块。 状态:正在进行的游戏的完整状态信息。不仅是董事会的位置,而且还有MoveList以及其他状态信息,例如现在要移动的人。在国际象棋中,将记录每个棋手的国王和乌鸦是否已移动。 例如,循环引用比比皆是:RuleBook需要了解游戏状态以确定给定时间可用的棋步,但是游戏州需要查询RuleBook的初始开始布局以及一次棋步会带来哪些副作用它是制造出来的(例如,下一个移动者)。 我尝试分层组织新的类集,其中RuleBook位于顶部,因为它需要了解所有信息。但这导致必须将许多方法移至RuleBook类中(例如进行移动),从而使其成为整体,并不能特别代表RuleBook应该是什么。 那么组织此活动的正确方法是什么?我应该将RuleBook变成BigClassThatDoesAlmostEverythingInTheGame以避免循环引用,而放弃对真实游戏进行精确建模的尝试吗?还是应该坚持使用相互依赖的类并哄骗编译器以某种方式对其进行编译,同时保留我的实际模型?还是我缺少一些明显的有效结构? 谢谢你提供的所有帮助!

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.