Questions tagged «object-oriented»

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


2
根据汇编语言,OOP如何在内存中组织“对象”和“类”?
内存中的对象如何组织? 例如,我知道一个函数是内存中的一段代码,它期望通过堆栈和/或寄存器的参数并处理它自己的堆栈帧。 但是对象的结构要复杂得多。他们是如何组织的?每个对象都具有与方法的“链接”,并将地址自身传递给该方法吗? 很高兴看到这个主题的很好的解释。 UPD。我提出的问题更加精确,并且我主要对静态键入语言感兴趣。

3
你为什么需要“自我”。在Python中引用实例变量?
我一直在编程多种语言,例如Java,Ruby,Haskell和Python。由于我从事的项目不同,我每天必须在多种语言之间切换。现在,问题是我常常忘记写代码,self因为Python中函数定义中的第一个参数与在同一对象上调用方法相同。 也就是说,我对Python的这种方法感到惊讶。基本上,我们必须键入更多内容才能完成工作,在Java和Ruby之类的语言中,通过自动引用当前对象中的变量使事情变得简单。 我的问题是为什么这是self必要的?纯粹是样式选择,还是有原因导致Python不能让您忽略selfJava和C ++的想法this?

3
组成重于继承,但
我试图自学软件工程,遇到一些使我感到困惑的冲突信息。 我一直在学习OOP,以及什么是抽象类/接口以及如何使用它们,但是随后我读到,应该“偏重于继承而不是继承”。我知道组合是指一个类组成/创建另一个类的对象以利用/与该新对象的功能交互。 所以我的问题是...我应该不使用抽象类和接口吗?是否不创建抽象类并在具体类中扩展/继承该抽象类的功能,而是仅编写新对象以使用其他类的功能? 或者,我应该使用组合并从抽象类继承吗?两者结合使用?如果是这样,您能否提供一些示例,说明其工作方式及其好处? 因为我最熟悉PHP,所以在继续使用其他语言并转移我新获得的SE技能之前,我正在使用它来提高OOP / SE技能,因此,使用PHP的示例非常受赞赏。

8
暴露异步功能的接口是泄漏抽象吗?
我正在阅读《依赖注入原理,实践和模式》一书,并了解了泄漏抽象的概念,该概念在本书中有很好的描述。 这些天来,我正在使用依赖注入重构C#代码库,以便使用异步调用而不是阻塞调用。这样做时,我正在考虑一些接口,这些接口在我的代码库中表示抽象,并且需要重新设计以便可以使用异步调用。 例如,考虑以下接口,它代表应用程序用户的存储库: public interface IUserRepository { Task<IEnumerable<User>> GetAllAsync(); } 根据书中的定义,泄漏抽象是设计时考虑到特定实现的抽象,因此某些实现详细说明了抽象本身的“泄漏”。 我的问题如下:我们可以考虑以异步方式设计的接口(例如IUserRepository)作为泄漏抽象的示例吗? 当然,并非所有可能的实现都与异步有关:只有进程外实现(例如SQL实现)才需要同步,但是内存中存储库不需要异步(实际上实现接口的内存中版本可能更多)如果接口公开异步方法很困难,例如,您可能必须在方法实现中返回类似Task.CompletedTask或Task.FromResult(users)之类的东西。 您如何看待?

2
在DDD中,域服务是否本质上仅仅是门面和/或中介模式?
在域驱动设计中,域层可以具有多个(传统)服务。例如,对于用户域,我们可能有: 一个UserFactory,它以不同的方式构建User对象 一个用户存储库,负责与基础结构层中的持久性服务进行交互 域层中的UserService是仅仅是这两个服务和基础结构层的中介者和/或Facade,还是它还有更多内容?

5
函数调用对性能有多少影响?
对于代码模块化,可读性和互操作性,尤其是在OOP中,必须将功能提取到方法或函数中。 但这意味着将进行更多的函数调用。 将我们的代码拆分为方法或函数实际上如何影响现代*语言的性能? *最受欢迎的语言:C,Java,C ++,C#,Python,JavaScript,Ruby ...

6
DDD符合OOP:如何实现面向对象的存储库?
DDD存储库的典型实现看起来不太像面向对象,例如一种save()方法: package com.example.domain; public class Product { /* public attributes for brevity */ public String name; public Double price; } public interface ProductRepo { void save(Product product); } 基础架构部分: package com.example.infrastructure; // imports... public class JdbcProductRepo implements ProductRepo { private JdbcTemplate = ... public void save(Product product) { JdbcTemplate.update("INSERT INTO …

1
使用朋友类封装C ++中的私有成员函数-好的做法还是滥用?
因此,我注意到可以通过执行以下操作来避免将私有函数放在标头中: // In file pred_list.h: class PredicateList { int somePrivateField; friend class PredicateList_HelperFunctions; public: bool match(); } // In file pred_list.cpp: class PredicateList_HelperFunctions { static bool fullMatch(PredicateList& p) { return p.somePrivateField == 5; // or whatever } } bool PredicateList::match() { return PredicateList_HelperFunctions::fullMatch(*this); } 私有函数永远不会在标头中声明,并且导入标头的类的使用者永远不需要知道它的存在。如果helper函数是模板,则这是必需的(替代方法是将完整的代码放在标头中),这就是我“发现”它的方式。如果添加/删除/修改私有成员函数,则不需要重新编译包含头文件的每个文件的另一个好处。所有专用功能都位于.cpp文件中。 所以... 这是一个众所周知的设计模式吗? 对我来说(来自Java / C#背景并且自己学习C …

4
具有无意义默认值的结构
在我的系统经常与机场代码(操作"YYZ","LAX","SFO"等),他们总是在完全一样的格式(3封信,表示为大写)。系统通常每个API请求处理这些代码中的25-50个(不同),总共分配了上千个代码,它们在我们应用程序的许多层中传递,并且经常比较它们的相等性。 我们从传递字符串开始就可以了,但仍然可以正常工作,但很快就发现了很多编程错误,因为在期望3位代码的地方传递了错误的代码。我们还遇到了一些问题,我们应该进行不区分大小写的比较,而没有这样做,从而导致错误。 由此,我决定停止传递字符串并创建一个Airport类,该类具有一个采用并验证机场代码的构造函数。 public sealed class Airport { public Airport(string code) { if (code == null) { throw new ArgumentNullException(nameof(code)); } if (code.Length != 3 || !char.IsLetter(code[0]) || !char.IsLetter(code[1]) || !char.IsLetter(code[2])) { throw new ArgumentException( "Must be a 3 letter airport code.", nameof(code)); } Code = code.ToUpperInvariant(); } public string …

3
处理库中可见性的常用方法是什么?
这个问题何时使用私人和当类使用受保护的让我去思考。(由于与之相关,我还将这个问题扩展到最终的类和方法。我使用Java编程,但是我认为这与每种OOP语言都相关) 接受的答案是: 一个好的经验法则是:使所有内容尽可能私密。 还有一个: 除非您需要立即对它们进行子类化,否则将所有类定为最终类。 使所有方法最终化,除非您需要立即子类化并覆盖它们。 除非需要在方法主体中进行更改,否则将所有方法参数都设置为最终值,这在大多数情况下还是很尴尬的。 这非常简单明了,但是如果我主要是编写库(GitHub上的开源)而不是应用程序怎么办? 我可以说很多图书馆和情况, 库以开发人员从未想过的方式扩展 由于可见性限制,必须使用“类加载器魔术”和其他技巧来完成此操作 库的使用方式不是为它们而建,而是以所需的功能“入侵” 由于存在小问题(错误,功能缺失,“错误”行为),无法使用库,原因是可见度降低,无法更改 无法解决的问题导致了巨大的,丑陋的和错误的解决方法,在这些解决方法中,覆盖简单的功能(私有或最终的)可能会有所帮助 实际上,我开始命名它们,直到问题过长,然后我决定将其删除。 我喜欢这样的想法,即没有多余的代码,比可见性更多的可见性,比需求更多的抽象性。当为最终用户编写应用程序时,这可能会起作用,因为最终代码仅由编写该应用程序的人员使用。但是,如果代码打算供其他开发人员使用,而原始开发人员则不可能事先考虑到每种可能的用例,并且很难/不可能进行更改/重构,那么这将如何保持呢? 既然大型开源库不是什么新鲜事物,那么在使用面向对象语言的此类项目中处理可见性的最常用方法是什么?



7
记录器在参数列表中的位置应该是什么[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 在我的代码中,我通过构造函数的参数列表为许多类注入了记录器 我注意到我将其随机放置:有时它是列表中的第一个,有时是最后一个,有时是介于两者之间 你有什么喜好吗?我的直觉说,在这种情况下,一致性是有用的,而我个人的偏好是将其放在首位,这样在丢失时更容易被注意到,而在丢失时更容易跳过。

6
如何避免垂头丧气?
我的问题是关于超类Animal的特殊情况。 我Animal可以moveForward()和eat()。 Seal延伸Animal。 Dog延伸Animal。 还有一个特殊的生物也Animal被称为Human。 Human还实现了方法speak()(不是由实现Animal)。 在接受抽象方法的实现中,Animal我想使用该speak()方法。如果不进行低调,这似乎是不可能的。杰里米·米勒(Jeremy Miller)在他的文章中写道,沮丧的气味。 在这种情况下,如何避免垂头丧气呢?

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.