Questions tagged «object-oriented»

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

2
Optionals和Nullable类型有什么区别
斯威夫特有Optionals。C#具有Nullable类型。 据我所知,它们具有相同的用途,除了某种类型的值外,它们还存储变量是否有值或未定义(未初始化)的信息。 问题是Optionals仅仅是Nullable名称不同的类型,还是其他概念上的区别? 换句话说,在谈论概念本身时,或者在没有Optionals或的语言的上下文中,Nullables使用术语是否重要? 当用语言实现该功能时,我是否键入类型Optionals<T>或名称都很重要Nullable<T>

7
使类方法传递类变量是一个坏主意吗?
这就是我的意思: class MyClass { int arr1[100]; int arr2[100]; int len = 100; void add(int* x1, int* x2, int size) { for (int i = 0; i < size; i++) { x1[i] += x2[i]; } } }; int main() { MyClass myInstance; // Fill the arrays... myInstance.add(myInstance.arr1, myInstance.arr2, myInstance.len); } add因为它是一个类方法,已经可以访问它需要的所有变量了,所以这不是一个好主意吗?有什么理由我应该或不应该这样做?

4
在多态性的背景下,如何处理为子类型添加的方法?
当使用多态性的概念时,您将创建一个类层次结构,并使用父代引用来调用接口函数,而无需知道对象具有哪种特定类型。这很棒。例: 您有动物的集合,并且可以调用所有动物的功能,eat而不必关心它是吃狗还是猫。但是在同一个类层次结构中,您的动物除了从类继承和实现Animal(例如makeEggs,getBackFromTheFreezedState等等)外,还具有其他动物。因此,在某些情况下,您可能需要了解调用其他行为的特定类型。 例如,如果是早晨,如果它只是一只动物,那么您可以致电eat;否则,如果是人类,那么请首先致电washHands,getDressed然后再致电eat。如何处理这种情况?多态性死亡。您需要找出对象的类型,这听起来像是代码气味。是否有处理这种情况的通用方法?

3
RxJava类Flowable是否可以合法地使用460个方法?
我刚刚开始使用RxJava,它是Java对ReactiveX的实现 (也称为Rx和Reactive Extensions)。一些真正让我吃惊的庞大规模RxJava的可流动类:它具有460点的方法! 公平起见: 有很多方法被重载,这大大增加了方法的总数。 也许应该拆分此类,但是我对RxJava的知识和理解非常有限。谁创造RxJava的人肯定是非常聪明的,他们可以大概是选择创建提供有效的参数可流动有这么多的方法。 另一方面: RxJava是Microsoft的Reactive Extensions的Java实现,甚至没有Flowable类,因此,这不是盲目移植现有类并用Java实现的情况。 [ 更新:斜体前一点是事实不正确:微软的可观察类,其中有超过400的方法,被用来作为RxJava的基础上可观察类,并且可流动相似,可观察到,但手柄背压的大量数据。因此,RxJava团队正在移植现有的类。这篇文章应该是挑战的原设计可观察到由微软而不是RxJava的类悬浮剂分类] RxJava已有3年多的历史了,因此这并不是由于缺乏对良好(SOLID)类设计原理的了解而导致代码被错误设计的示例(与Java的早期版本一样)。 对于像Flowable这样大的类,其设计本质上是错误的,但也许不是。这个SE问题的一个答案一个类方法的数量限制是多少?建议答案是“ 拥有所需的多种方法 ”。 显然,有些类无论其语言如何,都合法地需要大量方法来支持它们,因为它们不会轻易分解为更小的东西,并且它们具有大量的特征和属性。例如:字符串,颜色,电子表格单元格,数据库结果集和HTTP请求。对于类来说,也许有几十种方法来表示这些东西似乎并不合理。 但是Flowable是否真的需要460种方法,还是它是如此之大以至于它必然是不良类设计的一个例子? [需要明确的是:这个问题,特别是涉及RxJava的可流动类,而不是一般的神的对象。]

7
原始vs类代表简单的域对象?
什么时候使用特定于域的对象与普通字符串或数字的通用准则或经验法则是什么? 例子: 年龄层vs整数? FirstName类与String? 唯一ID与字符串 PhoneNumber类vs字符串vs长? 域名类与字符串? 我认为大多数OOP从业人员肯定会说PhoneNumber和DomainName的特定类。有关使它们变得有效以及如何进行比较的更多规则,使简单的类更易于处理和更安全。但是对于前三个,还有更多的争论。 我从来没有遇到过“年龄”类,但是有人认为它必须是非负数是有道理的(好吧,我知道您可以为负数年龄辩护,但这是一个很好的例子,它几乎等同于原始整数)。 字符串通常代表“名字”,但并不是完美的,因为空字符串是有效字符串,但不是有效名称。比较通常会忽略大小写。当然,有一些方法可以检查是否为空,不区分大小写,等等,但这需要使用者执行此操作。 答案是否取决于环境?我主要关心的是企业/高价值软件,该软件可以生存和维护超过十年。 也许我想得太多了,但是我真的很想知道是否有人对何时选择类还是原始有规则。

3
什么时候可以使用并行阵列?
我一直在尝试使用所谓的“并行数组”或列表的代码(新代码)。意味着有2个数组包含相关数据,并通过它们在数组中的位置(索引)进行链接。 我认为这很容易混淆,并且容易出现各种错误。我通常建议的解决方案是创建一个名为CompanyCompanyId和CompanyName 的对象。 一个非常真实的例子: List<string> companyNames; List<int> companyIds; //...They get populated somewhere and we then process for(var i=0; i<companyNames.Count; i++) { UpdateCompanyName(companyIds[i],companyNames[i]); } 这些并行数组是否被认为是不好的做法?

5
OOP编码风格:初始化构造函数上的所有内容吗?
我仍然认为自己是一个学徒程序员,所以我一直在寻找学习典型编程的“更好”方法。今天,我的同事认为我的编码风格做了一些不必要的工作,我想听听别人的意见。通常,当我使用OOP语言(通常是C ++或Python)设计类时,会将初始化分为两个不同的部分: class MyClass1 { public: Myclass1(type1 arg1, type2 arg2, type3 arg3); initMyClass1(); private: type1 param1; type2 param2; type3 param3; type4 anotherParam1; }; // Only the direct assignments from the input arguments are done in the constructor MyClass1::myClass1(type1 arg1, type2 arg2, type3 arg3) : param1(arg1) , param2(arg2) , param3(arg3) {} …

4
单一职责模式对班级应该有多具体?
例如,假设您有一个控制台游戏程序,该程序具有往返于控制台的各种输入/输出方法。难道是聪明的,让他们在一个单一inputOutput类或把它们分解到更具体的类,如startMenuIO,inGameIO,playerIO,gameBoardIO,等使得每个班大约有1-5的方法呢? 同时,如果最好将它们分解,将它们放置在IO命名空间中是否明智,从而使它们更冗长,例如:IO.inGame等?

10
从同一类构造的对象可以具有唯一的方法定义吗?
我知道这似乎是一个奇怪的问题,因为两个或更多共享同一类的对象的要点是它们的行为是相同的,即它们的方法是相同的。 但是,我很好奇是否有任何OOP语言可以让您以可以为对象的字段分配不同值的相同方式重新定义对象的方法。结果将是从同一类构造的对象不再表现出完全相同的行为。 如果我没记错的话,您可以使用此JavaScript吗?我问这个问题,为什么有人要这样做呢?

3
创建对象时,是将新的内存分配给实例字段和方法,还是仅分配给实例字段
我有一个下课 class Student{ int rollNumber; int marks; public void setResult(int rollNumber, int marks){ this.rollNumber=rollNumber; this.marks=marks; } public void displayResult(){ System.out.println("Roll Number= "+this.rollNumber+" Marks= "+this.marks); } } 现在,我创建两个类型为Student的对象,如下所示 Student s1=new Student(); Student s2=new Student(); 现在,为实例字段分配了两组不同的内存。现在我的问题是为方法(setResult和displayResult)分配内存两次还是一次? 请参见下图,您能帮我说一下哪个图提供了正确的信息。


3
在实践中如何遵守开闭原则
我了解开放原则的意图。这是通过告诉您尝试在不进行修改的情况下进行扩展,以降低破坏已在修改过程中起作用的内容的风险。 但是,我在理解此原理在实践中的应用时遇到了一些麻烦。据我了解,有两种方法可以应用它。在可能的更改之前和之后: 之前:编程抽象并尽可能“预测未来”。例如,drive(Car car)如果将来将Motorcycles添加到系统中,则必须更改 方法,因此它可能违反了OCP。但是该方法drive(MotorVehicle vehicle)将来不太可能需要更改,因此它遵循OCP。 但是,很难预测未来并提前知道将对系统进行哪些更改。 之后:需要更改时,扩展类而不是修改其当前代码。 练习1并不难理解。但是,在实践2中,我很难理解如何申请。 例如(我从YouTube视频中获取了它):假设我们在类中有一个接受CreditCard对象的方法:makePayment(CraditCard card)。将一天Voucher添加到系统中。此方法不支持它们,因此必须对其进行修改。 首先实现该方法时,我们无法预测未来,无法以更抽象的术语进行编程(例如makePayment(Payment pay),因此现在我们必须更改现有代码。 练习2说,我们应该通过扩展而不是修改来添加功能。这意味着什么?我应该继承现有的类而不是简单地更改现有的代码吗?我是否应该围绕它进行某种包装,以避免重写代码? 还是该原则甚至不涉及“如何正确修改/添加功能”,而是涉及“如何避免必须首先进行更改(即从程序到抽象)”?

4
是否可以将应用程序宽松地耦合到其框架?
假设我正在开发一个Web应用程序。我的首选是将PHP与无脂肪框架(F3)和MVC模式结合使用。明年,我可能会决定我要切换到Zend Framework,或者甚至是ASP.NET MVC。尝试以松散耦合到其框架的方式设计应用程序是否有意义,或者该框架是否过于完整以至于无法实现这一目标? 我问的唯一原因是因为它最近与一位同行进行了交谈,这位同行批评我的派是将应用程序与F3松散耦合的想法。

3
“您将如何构建此网站/应用程序”面试问题的一般思考过程[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 我收集了许多面试问题,例如“描述如何设计相册应用程序”,“描述如何设计此特定网站的特定功能”(例如在Facebook上喜欢,在亚马逊上推荐,购物车,游戏黑色杰克)。那么,如果有成千上万的东西呢?你会改变什么? 看起来这是在期待数据库架构还是一堆类定义(或两者都在?)。我在学校里已经学习过数据库,但是我以前从未真正设计过一个应用程序,并且很难知道从哪里开始,我提出的设计是否“好”以及我可以进行哪些更改以使其可扩展。 设计这些系统时是否有一般的方法或思考过程?我应该设法避免的一般问题/设计中出现的很多问题?有人可以指导我讲解其中的一个(或最好是全部,同时比较每个人的需求)并解释一下: 1)您如何提出需要哪些实体?2)您如何决定一切将拥有什么关系?3)您如何将性能优化纳入设计?4)我使用类或数据库吗?会有所不同吗(例如,我是否有一个不能真正转换为数据库表的类?) 我问的主要原因是因为我正在经历“破解编码面试”,我的答案与作者的答案完全不同-我对重要的类有不同的看法。 我的尝试: 使用照片共享应用程序,我将获得以下课程/表格:可以肯定的是照片和用户。 然后,我认为如果我们尝试创建模式,那么如果我们假设照片中的每个人都链接到照片,那么将存在一个链接照片和用户的表格(此表格是否必要?如果不是,是否仍然是惯例?是否有用于多对多关系的单独表格?)。 但是,如果我们尝试采用一种面向对象的方法,也许我们会拥有一个名为Album的类,它可以完成所有工作并具有来自其他两个表/类的所有信息。这是我在书中注意到的一件事-有一堆类,然后一个类基本上具有所有信息并连接了其他类-这是常见的吗?例如,在我上面的示例中,这似乎适用吗? 我只是希望遵循一些通用规则/准则,因为现在我还不知道如何判断大型系统的良好架构是什么样的。

7
如果我的代码不能兼而有之,那么应该是DRY还是可读的?
我正在为一个简单的加密练习编写Ruby代码,并且经常遇到这个难题(如果您必须知道的话,该练习是单人密码)。这是一个问题,我是否应该使用使函数可读的描述性变量和单步语句来填充我的逻辑,而不是使用简洁,密集的语句来消除重复和/或最大程度地减少错误的机会,从而填充我的逻辑。 我最近的例子:我的程序接受输入,并且由于严格的格式准则,它可以轻松确定输入是否应该加密或解密。为简化起见,一旦加密密钥和消息被转换/生成为兼容,就可以从加密消息中减去密钥,或者将密钥添加到未加密消息中,以获得所需的输出(将密钥视为加密,消息+加密=代码;代码-加密=消息)。DRY位置告诉我,我应将加密的消息与未加密的消息进行不同的转换,这样就无需区分使用加密密钥并将其应用于消息的功能。我发现这意味着我需要在函数中嵌套一些if语句,但逻辑似乎很牢固。但是,此代码不容易阅读。 另一方面,我可以编写两个不同的函数,这些函数根据应用程序确定加密或解密时设置的标志来调用。这将更易于阅读,但会复制将加密密钥应用于消息的高级功能(导致对其进行加密或解密)。 我应该倾向于可读代码还是简洁代码?还是我错过了获得此功能并满足这两个原则的另一种方法?这是一个必须考虑项目目的并做出最佳决策以达到该目的的规模吗? 到目前为止,相对于可读代码,我倾向于强调简洁的DRY代码。

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.