Questions tagged «object-oriented»

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


4
处理模型和视图时切换与多态
我想不出更好的解决方案。我有一个显示元素列表的视图控制器。这些元素是可以作为B,C,D等的实例并从A继承的模型。因此,在该视图控制器中,每个项目都应转到应用程序的不同屏幕,并在用户选择其中的一个时传递一些数据。 。我想到的两个选择是(请忽略语法,它不是特定的语言) 1)开关(我知道那很烂) //inside the view controller void onClickItem(int index) { A a = items.get(index); switch(a.type) { case b: B b = (B)a; go to screen X; x.v1 = b.v1; // fill X with b data x.v2 = b.v2; case c: go to screen Y; etc... } } 2)多态 //inside …

2
为什么Java不支持像C ++这样的私有/受保护的继承?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 在C ++中继承类时,用户可以指定访问说明符,例如, class Base { public int mem1; protected in mem2; }; class Derived1 : **private** Base { // mem1 will be private here. // mem2 will be private here. }; class Derived2 : **protected** Base { // mem1 will be protected here. // mem2 will be protected …


6
OO设计,如何为音调和声建模?
我已经开始用C ++ 11编写一个程序来分析和弦,音阶和和声。我在设计阶段遇到的最大问题是,音符“ C”是音符,和弦类型(Cmaj,Cmin,C7等)和键类型(Cmajor,Cminor的键)。间隔也会出现相同的问题(小三,大三)。 我使用的是基类Token,它是程序中所有“符号”的基类。因此,例如: class Token { public: typedef shared_ptr<Token> pointer_type; Token() {} virtual ~Token() {} }; class Command : public Token { public: Command() {} pointer_type execute(); } class Note : public Token; class Triad : public Token; class MajorTriad : public Triad; // CMajorTriad, etc class Key …

1
为什么面向对象的范例要花这么长时间才能成为主流?
我读了这个问题,这让我开始思考另一件事。面向对象的语言。我不确定第一个是何时创建的,但是为什么要花这么长时间才成为主流? C变得非常流行,但是多年之后(数十年?)才没有成为面向对象的C ++。 90年代以前没有主流语言是面向对象的 面向对象确实似乎在Java和C ++的同时流行 现在,我的问题是,为什么要花这么长时间?为什么C最初不被认为是一种面向对象的语言?只使用一小部分C ++不会对核心语言产生很大的影响,所以为什么这个想法直到90年代才流行起来?

2
寻找一些面向对象的设计建议
我正在开发一个应用程序,该应用程序将用于在工业环境中打开和关闭阀门,并且正在考虑这样的简单操作:- public static void ValveController { public static void OpenValve(string valveName) { // Implementation to open the valve } public static void CloseValve(string valveName) { // Implementation to close the valve } } (该实现会将一些字节的数据写入串行端口以控制阀门-从阀门名称派生的“地址”,以及“ 1”或“ 0”来打开或关闭阀门)。 另一个开发人员问我们是否应该为每个物理阀创建一个单独的类,其中有几十个。我同意,最好使用PlasmaValve.Open()而不是编写类似的代码ValveController.OpenValve("plasma"),但这是否太过分了? 另外,我想知道如何最好地考虑到一些假设的未来需求: 我们被要求支持一种新型的阀门,该阀门需要不同的值来打开和关闭它(不是0和1)。 我们被要求支持可以设置在0-100之间的任何位置的阀,而不是简单地“打开”或“关闭”。 通常,我会在这种情况下使用继承,但是最近我开始着手解决“继承之上的组合”问题,并想知道使用组合是否有一个更好的解决方案?

2
FP用于仿真和建模
我将要开始一个模拟/建模项目。我已经知道OOP用于此类项目。但是,研究Haskell使我考虑使用FP范例对组件系统进行建模。让我详细说明: 假设我有一个类型A的组件,其特征是一组数据(如温度或压力,PDE和某些边界条件等参数),以及一个类型B的组件,其特征是一组不同的数据(不同或相同的参数,不同的PDE和边界条件)。我们还假设将要应用于每个组件的函数/方法是相同的(例如,Galerkin方法)。对象的可变状态将用于非恒定参数。 如果要使用OOP方法,我将创建两个对象,这些对象将封装每种类型的数据,解决PDE的方法(继承将在此处用于代码重用)和PDE的解决方案。 另一方面,如果我要使用FP方法,则每个组件都将分解为数据部分和对数据起作用的功能,以获得PDE的解决方案。非常数参数将作为其他函数(例如时间)传递或由某种可变性(可变性的仿真等)表示。假设对数据进行线性运算是微不足道的,这种方法对我来说似乎更简单。 总之,与OOP相比,实施FP方法实际上是否更简单,更易于管理(添加不同类型的组件或新方法来解决pde)? 我来自C ++ / Fortran,而且我不是专业程序员,所以请在出现任何错误的地方进行纠正。

4
面向对象的编程:getter / setter或逻辑名
我目前正在考虑要编写的类的接口。此类包含字符的样式,例如,字符是否为粗体,斜体,带下划线等。我已经辩论了两天,是否应该将getter / setter或逻辑名用于将值更改为这些样式。尽管我倾向于使用逻辑名称,但这确实意味着编写的代码效率不高,逻辑也不如逻辑。让我举一个例子。 我有一类CharacterStyles具有成员变量bold,italic,underline(和其他一些人,但我会留下来,以保持它的简单)。允许程序其他部分访问这些变量的最简单方法是编写getter / setter方法,以便您可以执行styles.setBold(true)和styles.setItalic(false)。 但是我不喜欢这样。不仅是因为很多人说吸气剂/装料剂破坏了封装(真的那么糟糕吗?),而且主要是因为它对我而言似乎不合逻辑。我希望通过一种方法styles.format("bold", true)或类似方法来设置角色的样式,但不能通过所有这些方法来设置样式。 不过有一个问题。由于您无法通过C ++中的字符串内容访问对象成员变量,因此我要么必须为所有样式编写一个大的if语句/开关容器,要么必须将样式存储在关联数组中(地图)。 我不知道什么是最好的方法。我想我应该写吸气剂/设定器,下一刻我倾向于另一种方式。我的问题是:你会怎么做?为什么要这么做?

4
仅将接口用于分类是不好的做法吗?
例如: 说我有课A,B,C。我有两个接口,我们称它们为IAnimal和IDog。IDog继承自IAnimal。A和B是IDogs,虽然C不是,但它是一个IAnimal。 重要的部分是不IDog提供任何附加功能。它仅用于允许A和B,但不C以作为参数传递给某些方法进行传递。 这是不好的做法吗?

4
您如何获得OOP设计的良好实践?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 2年前关闭。 我意识到我很难创建OOP设计。我花了很多时间来确定此属性是否正确设置为X类。 例如,这是一个有几天的帖子:https : //codereview.stackexchange.com/questions/8041/how-to-improve-my-factory-design 我不相信我的代码。因此,我想改善设计,减​​少设计时间。 您如何学习创建好的设计?您可以推荐我一些书吗?

3
命令/查询分隔是否适用于创建对象并返回其ID的方法?
假设我们有一个调用业务流程的服务。此过程将在数据层上调用以在数据库中创建类型为A的对象。 之后,我们需要再次调用数据层的另一个类以在数据库中创建类型B的实例。我们需要传递有关外键A的一些信息。 在第一种方法中,我们创建一个对象(修改状态)并在单个方法中返回其ID(查询)。 在第二种方法中,我们有两种方法,一种是保存的(createA),另一种是查询的(getId)。 public void FirstMethod(Info info) { var id = firstRepository.createA(info); secondRepository.createB(id); } public void SecondMethod(Info info) { firstRepository.createA(info); var key = firstRepository.getID(info); secondRepository.createB(key); } 据我了解,第二种方法更完全遵循命令查询分离。但是我发现查询数据库来获取我们刚刚创建的对象既浪费又违反直觉。 您如何在这种情况下调和CQS? 是否仅第二种方法遵循CQS,如果可以,在这种情况下是否更可取?

4
避免肿的域对象
我们正在尝试使用DDD方法将数据从庞大的Service层移至Domain层。当前,我们的服务中有很多业务逻辑,这些业务逻辑遍布各地,并且无法从继承中受益。 我们有一个中心的Domain类,这是我们大多数工作的重点-Trade。贸易对象将知道如何定价,如何估计风险,验证自身等。然后,我们可以用多态性替换条件。例如:SimpleTrade将以一种方式定价,而ComplexTrade将以另一种定价。 但是,我们担心这会使贸易类膨胀。它确实应该负责自己的处理,但是随着添加更多功能,类的大小将成倍增加。 所以我们有选择: 将处理逻辑放在贸易类中。现在,根据交易类型,处理逻辑是多态的,但是交易类别现在具有多种责任(定价,风险等)并且规模很大 将处理逻辑放入其他类,例如TradePricingService。Trade继承树不再具有多态性,而是类更小并且更易于测试。 建议的方法是什么?

9
如何最好地实践OOP概念/原理?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我想学习面向对象的编程语言,我不想为了任何目的而仅仅为了了解OOP的整个概念。那么谁能告诉我应该开始学习哪种语言?

3
类与结构
在C ++和其他受影响的语言中,有一个称为Structure(struct)的构造,另一个称为class。两者都能够容纳函数和变量。一些区别是: 类在堆中struct被分配了内存,在堆栈中被分配了内存(注意:这对于C ++是错误的,但是在OP所谓的“受影响的语言”中可能是正确的) 默认情况下,类变量是私有的,而struct它们是公共的 我的问题是:是否以struct某种方式放弃了上课?如果是这样,为什么?除了上述差异之外,a struct可以完成类所具有的所有相同功能。那么为什么要放弃呢?

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.