Questions tagged «object-oriented»

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

17
为什么有私有字段,保护不够?
private类字段/属性/属性的可见性有用吗?在OOP中,迟早要创建一个类的子类,在这种情况下,最好能够理解并能够完全修改实现。 当我对一个类进行子类化时,我要做的第一件事就是将一堆private方法更改为protected。但是,对外部世界隐藏细节很重要-因此我们需要protected而不仅仅是public。 我的问题是:您是否知道一个重要的用例,private而不是protected一个好的工具,或者两个选项“ protected&public”对于OOP语言是否足够?

23
如果不可变的对象很好,那么人们为什么继续创建可变的对象?[关闭]
如果不变的对象¹很好,简单并且可以在并发编程中受益,那么为什么程序员会继续创建可变的对象²? 我有4年的Java编程经验,正如我所看到的,创建类之后,人们要做的第一件事就是在IDE中生成getter和setter(因此使其可变)。是否缺乏意识,或者在大多数情况下我们能否摆脱使用可变对象的困扰? ¹ 不可变对象是创建后状态无法修改的对象。 ² 可变对象是创建后可以修改的对象。


2
软件包名称应为单数还是复数?
通常,尤其是在库中,程序包包含围绕单个概念组织的类。示例: xml,sql,user,config,db。我认为我们所有人都很自然地认为这些软件包以单数形式正确。 com.myproject。XML .Element com.myproject。SQL ■连接 com.myproject。用户。用户 com.myproject。用户 .UserFactory 但是,如果我有一个实际上包含单个类型的实现集合的包-例如任务,规则,处理程序,模型等,哪个更可取? com.myproject。任务 .TakeOutGarbageTask com.myproject。任务 .DoTheDishesTask com.myproject。任务 .PaintTheHouseTask 要么 com.myproject。任务 .TakeOutGarbageTask com.myproject。任务 .DoTheDishesTask com.myproject。任务 .PaintTheHouseTask

15
为什么我们需要私有变量?
为什么在类中需要私有变量? 我读过的每本关于编程的书都说这是一个私有变量,这是您定义它的方式,但仅此而已。 在我看来,这些解释的措辞总是像我们对我们的职业确实存在信任危机。这些解释听起来总是像其他程序员要弄乱我们的代码一样。但是,有许多编程语言没有私有变量。 私有变量可以帮助防止什么? 您如何确定特定财产是否应为私有?如果默认情况下每个字段都应该是私有的,那么为什么在类中有公共数据成员呢? 在什么情况下应该公开变量?

9
聚合与构成
我了解OOP中的组合是什么,但是我无法清楚地知道什么是聚合。有人可以解释吗?

16
Getter和Setters何时合理
getter和setter经常被批评为不合适的OO。另一方面,我见过的大多数OO代码都有大量的getter和setter方法。 何时使用吸气剂和塞特剂?您是否尝试避免使用它们?他们是否普遍滥用? 如果您最喜欢的语言具有属性(我的语言),那么此类问题也被视为此问题的获取者和准备者。从面向对象方法论的角度来看,它们是同一回事。他们只是语法更好。 Getter / Setter批评的来源(部分摘自评论以使他们更清晰可见): http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html http://typicalprogrammer.com/?p=23 http://c2.com/cgi/wiki?AccessorsAreEvil http://www.darronschall.com/weblog/2005/03/no-brain-getter-and-setters.cfm http://www.adam-bien.com/roller/abien/entry/encapsulation_violation_with_getters_and http://www.yegor256.com/2014/09/16/getters-and-setters-are-evil.html 简单地说一下批评:Getters和Setters允许您从对象外部操纵对象的内部状态。这违反了封装。只有对象本身应该关心其内部状态。 以及示例程序版本的代码。 struct Fridge { int cheese; } void go_shopping(Fridge fridge) { fridge.cheese += 5; } Mutator版本的代码: class Fridge { int cheese; void set_cheese(int _cheese) { cheese = _cheese; } int get_cheese() { return cheese; } } void …

14
“偏爱组成而不是继承”的概念从何而来?
在过去的几个月中,“偏爱继承而不是继承”的口号似乎无处不在,并成为编程社区中的某种模因。每次看到它,我都会有些迷惑。就像有人在说“青睐锤子”。以我的经验,组合和继承是具有不同用例的两个不同工具,并且将它们视为可互换,并且一个在本质上优于另一个是没有意义的。 另外,我从来没有看到过真正的解释,说明为什么继承不好而组成很好,这让我更加怀疑。是否应该只凭信心接受?Liskov替换和多态性具有众所周知的明显好处,而IMO构成了使用面向对象编程的全部要点,而且从来没有人解释为什么应该丢弃它们以利于组合。 有谁知道这个概念的来历,其背后的原理是什么?

8
在软件行业中典型的不良编程习惯是吗?[关闭]
一个月前,我刚开始担任软件开发人员的第一份工作。我所学到的有关OOP,SOLID,DRY,YAGNI,设计模式,SRP等的所有信息都可以丢到窗外。 他们使用C#.NET Webforms并使用很少的外部类(绝对不称为对象)来执行“代码隐藏”中的几乎所有操作。他们确实使用自定义控件并重复使用它们。关于唯一使用的对象是Entity Framework。他们为每个客户端重用代码隐藏。他们有400行长的方法来处理所有类型的工作。对于新客户端,他们采用aspx和aspx.cs并剥离客户端代码,然后开始添加新的特定于客户端的代码。 他们的第一个借口是增加额外的维护,更多的代码就是更多的维护。这是一家包括我在内的三个开发商的小商店。一个开发人员拥有30多年的经验,而另一个则拥有20多年的经验。一个曾经是游戏开发人员,另一个曾经一直使用C和C ++工作。 这在软件行业中有多普遍?我如何确保自己掌握OOP和相关原则?我在业余时间进行练习,我觉得我真的需要在一个经验丰富的开发人员下工作,以更好地使用OOP。

17
从不存在返回值的函数/方法中返回NULL或空值更好吗?
我在这里寻找建议。我正在努力在不存在返回值或无法确定返回值的情况下从方法返回NULL还是返回空值更好。 以以下两种方法为例: string ReverseString(string stringToReverse) // takes a string and reverses it. Person FindPerson(int personID) // finds a Person with a matching personID. 在中ReverseString(),我会说返回一个空字符串,因为返回类型是字符串,因此调用者期望得到。同样,通过这种方式,调用方将不必检查是否返回了NULL。 在中FindPerson(),返回NULL似乎更合适。无论是否new Person()返回NULL或空的Person Object(),调用者都必须在对其进行任何操作(如调用UpdateName())之前检查一下Person对象是否为NULL或为空。因此,为什么不只在此处返回NULL,然后调用方只需检查NULL。 还有其他人为此感到挣扎吗?任何帮助或见解表示赞赏。

14
方法对您来说理想的长度是多少?[关闭]
在面向对象的程序设计中,方法的最大长度当然没有确切的规则,但是我仍然发现这两个引号有些矛盾,因此我想听听您的想法。 罗伯特·马丁(Robert Martin)在《干净代码:敏捷软件工艺手册》中说: 功能的第一个规则是它们应该很小。功能的第二个规则是它们应该小于该值。函数不能长100行。函数几乎不应超过20行。 并列举了肯特·贝克(Kent Beck)的Java代码示例: 他程序中的每个函数只有两行,三行或四行。每个明显透明。每个人都讲一个故事。每个人都以引人注目的顺序将您引向了下一个。那就是您的功能应该有多短! 这听起来不错,但另一方面,在“代码完成”中,史蒂夫·麦康奈尔(Steve McConnell)说了很不一样的话: 例程应允许有机增长到100-200行,数十年的证据表明,这种长度的例程不会比较短的例程容易出错。 他还提到了一项研究,该研究说65行或更长的例程开发起来比较便宜。 因此,尽管对此事有不同意见,但您是否有实用的最佳实践?

6
真正的“业务逻辑”是什么?
自2009年开始使用PHP以来,我一直从事Web开发。当我搬到ASP.NET时,我听到了很多有关DDD和OOAD的信息,其中很多重点都放在了这种“业务逻辑”和“业务规则”上。关键是,到目前为止,我开发的所有应用程序都与CRUD操作有关,而我在实践中从未见过这些东西。 我简直无法想象这些东西在实践中到底会是什么。那么,这个业务逻辑到底是什么?它如何适合应用程序?我知道这些方法是作为领域模型中的方法实现的,但是这些方法可能是什么,以及它们在应用程序中的可能位置?

12
如果执行TDD,是否应该避免使用私有方法?
我现在正在学习TDD。我的理解是,私有方法是不可测试的,不应担心,因为公共API将提供足够的信息来验证对象的完整性。 我了解OOP已有一段时间了。据我了解,私有方法使对象更易于封装,从而更能抵抗更改和错误。因此,默认情况下应使用它们,并且仅将对客户端重要的那些方法公开。 好吧,对于我来说,可以创建一个仅具有私有方法并通过侦听其他事件与其他对象进行交互的对象。这将被非常封装,但是完全不可测试。 另外,为了测试而添加方法也被认为是不好的做法。 这是否意味着TDD与封装不一致?适当的余额是多少?我现在倾向于公开大多数或所有方法...

17
封装仍然是OOP坚持的大象之一吗?
封装告诉我将所有或几乎所有字段都设为私有,并通过getter / setter公开这些字段。但是现在出现了Lombok之类的库,这些库使我们可以用一个简短的注解公开所有私有字段@Data。它将为所有私有字段创建getter,setter和set构造函数。 有人可以向我解释将所有字段隐藏为私有,然后再通过一些额外的技术将所有字段公开的感觉是什么?为什么我们不仅仅使用公共字段呢?我觉得我们走了漫长而艰难的路,才回到起点。 是的,还有其他一些可以通过getter和setter方法工作的技术。我们不能通过简单的公共领域使用它们。但是出现这些技术仅仅是因为我们拥有众多特性-公共获取者/设置者背后的私有领域。如果我们没有这些财产,这些技术将另辟way径,并为公共领域提供支持。一切都将变得简单,我们现在不需要龙目岛了。 整个周期的整体意义是什么?在现实生活的编程中,封装真的有意义吗?

13
如果可以,是否应该消除局部变量?
例如,要在Android中保持CPU开启,我可以使用以下代码: PowerManager powerManager = (PowerManager)getSystemService(POWER_SERVICE); WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "abc"); wakeLock.acquire(); 但我认为局部变量powerManager和wakeLock可以消除: ((PowerManager)getSystemService(POWER_SERVICE)) .newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag") .acquire(); 类似的场景出现在iOS警报视图中,例如:from UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"my title" message:@"my message" delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil]; [alert show]; -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ [alertView release]; } 至: [[[UIAlertView alloc] initWithTitle:@"my title" message:@"my message" delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil] show]; -(void)alertView:(UIAlertView *)alertView …

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.