Questions tagged «object-oriented»

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

7
函数编程与带类的OOP相比
最近,我对函数式编程的某些概念感兴趣。我已经使用OOP一段时间了。我可以看到如何在OOP中构建一个相当复杂的应用程序。每个对象都会知道该对象执行的操作。还是父母班上的任何事情都可以。因此,我可以简单地告诉Person().speak()别人说话。 但是如何在函数式编程中做类似的事情?我看到函数是头等舱物品。但是该功能只做一件事。我是否可以简单地使用一个say()浮动的方法,并使用等效的Person()参数来调用它,以便使我知道在说些什么呢? 因此,我可以看到简单的事情,在函数式编程中,我将如何做OOP和对象的比较,从而可以模块化和组织代码库? 作为参考,我对OOP的主要经验是Python,PHP和一些C#。我正在查看的具有功能特性的语言是Scala和Haskell。虽然我倾向于Scala。 基本示例(Python): Animal(object): def say(self, what): print(what) Dog(Animal): def say(self, what): super().say('dog barks: {0}'.format(what)) Cat(Animal): def say(self, what): super().say('cat meows: {0}'.format(what)) dog = Dog() cat = Cat() dog.say('ruff') cat.say('purr')

6
如果它允许更轻松地解决另一个问题,是否可以散发出代码的味道?[关闭]
我和一群朋友在过去的一段时间里一直在从事一个项目,我们想发明一种很好的面向对象的方法来表示特定于我们产品的方案。基本上,我们正在开发东方风格的 子弹地狱游戏,我们希望建立一个系统,在其中可以轻松表示我们可以梦想的子弹的任何可能行为。 这就是我们所做的;我们制作了一个非常优雅的架构,使我们可以将项目符号的行为划分为不同的组件,这些组件可以随意附加到项目符号实例上,类似于Unity的组件系统。它工作得很好,易于扩展,灵活并且覆盖了我们的所有基础,但是存在一个小问题。 我们的应用程序还涉及大量的程序生成,即我们以程序方式生成项目符号的行为。为什么这是个问题?好吧,我们的OOP解决方案虽然表现优雅,但是代表人的举止却很复杂,如果没有人使用它,工作起来会有些复杂。人类足够聪明,可以想到既合理又明智的问题解决方案。程序生成算法还不那么聪明,我们发现很难实现一个充分利用OOP架构的AI。诚然,该体系结构的一个缺陷是并非在所有情况下都直观。 因此,为了解决此问题,我们基本上将不同组件提供的所有行为都推到了bullet类中,这样我们可以想像到的一切都直接在每个bullet实例中提供,而与其他关联的组件实例不同。这使我们的过程生成算法更容易使用,但是现在我们的bullet类是一个巨大的上帝对象。到目前为止,它很容易成为程序中最大的类,它的代码量是其他任何代码的五倍以上。维护也有点麻烦。 可以让我们的一个类变成一个上帝对象,只是为了使其更容易处理另一个问题吗?通常,如果它允许更轻松地解决其他问题,代码中是否会有代码味道是可以的吗?

18
如果客户要求您不要使用面向对象的编程,您将怎么办?
我正在编写一个程序来模拟网格中蚂蚁的活动(PDF)。蚂蚁可以四处走动,捡东西和丢东西。 问题是,虽然可以通过类属性轻松地跟踪蚂蚁的动作和每个蚂蚁的位置(并且我们可以轻松地创建此类蚂蚁的许多实例),但我的客户说,由于他具有函数式编程的背景,因此他希望使用功能编程进行仿真。 需要明确的是,来自客户端的原始词语仅是“ no class”,而不是“ function programming”。因此,我认为他并不意味着函数式编程,我势在必行。另外,我没有函数编程的经验。 但是,我认为专注于这个问题,特别是关于功能性编程要求,而不只是简单地“必须执行”,这是有益的。 您将如何处理这种情况?您是否会说服客户使用面向对象的编程更清洁,尝试遵循他的要求并为他提供劣质的代码,或者做其他事情?

14
为什么对象通过引用传递?
一个正在研究面向对象的年轻同事问我为什么每个对象都通过引用传递,这与原始类型或结构相反。它是Java和C#等语言的共同特征。 我找不到适合他的答案。 此设计决定的动机是什么?这些语言的开发人员是否厌倦了每次都必须创建指针和typedef的麻烦?

10
您通常将对象或其成员变量发送到函数中吗?
这两种情况之间普遍接受的做法是: function insertIntoDatabase(Account account, Otherthing thing) { database.insertMethod(account.getId(), thing.getId(), thing.getSomeValue()); } 要么 function insertIntoDatabase(long accountId, long thingId, double someValue) { database.insertMethod(accountId, thingId, someValue); } 换句话说,通常是将整个对象传递给您,还是只传递所需的字段,这更好吗?

5
覆盖具体方法是否有代码气味?
重写具体方法是否确实有代码异味?因为我认为您需要重写具体方法: public class A{ public void a(){ } } public class B extends A{ @Override public void a(){ } } 可以重写为 public interface A{ public void a(); } public class ConcreteA implements A{ public void a(); } public class B implements A{ public void a(){ } } 如果B要在A中重用a(),则可以重写为: public class …

7
在循环中设置标记以供以后使用是否有代码味道?
我有一段代码在其中迭代地图,直到某个条件为真,然后再使用该条件做更多的事情。 例: Map<BigInteger, List<String>> map = handler.getMap(); if(map != null && !map.isEmpty()) { for (Map.Entry<BigInteger, List<String>> entry : map.entrySet()) { fillUpList(); if(list.size() > limit) { limitFlag = true; break; } } } else { logger.info("\n>>>>> \n\t 6.1 NO entries to iterate over (for given FC and target) \n"); } if(!limitFlag) …

10
假设有一群马,我如何找到所有独角兽的平均角长?
上面的问题是我在遗留代码中遇到的一个常见问题的抽象示例,或更准确地说,是以前解决该问题的尝试所导致的问题。 我可以想到至少一种旨在解决此问题的.NET框架方法,例如该Enumerable.OfType<T>方法。但是,您最终最终在运行时询问对象的类型这一事实与我不对。 除了问每匹马:“你是独角兽吗?” 还想到以下方法: 尝试获取非独角兽角的长度时引发异常(暴露了不适用于每匹马的功能) 返回一个非独角兽号角长度的默认值或魔术值(需要在所有想要对一组全都是非独角兽的马进行角统计的代码中添加默认检查) 消除继承,并在马上创建一个单独的对象,该对象告诉您马是否为独角兽(这可能会将同一问题推下一层) 我觉得最好用“不回答”来回答。但是,您如何解决这个问题?如果取决于这个问题,您的决定的背景是什么? 对于这个问题是否仍然存在于功能代码中(或者也许仅存在于支持可变性的功能语言中),我也会感兴趣。 这被标记为以下问题的可能重复: 如何避免向下转换? 该问题的答案假设一个人拥有一个HornMeasurer,必须进行所有的号角测量。但这是对基于平等原则而形成的代码库的强加,即每个人都应该可以自由地测量马的角。 缺少a时HornMeasurer,可接受的答案的方法反映了上面列出的基于异常的方法。 关于马和独角兽都是马,还是独角兽是马的神奇亚种,评论中也有些困惑。两种可能性都应该考虑-也许一个比另一个更可取吗?

10
函数式编程支持者将如何在Code Complete中回答此声明?
在第二版的839页上,史蒂夫·麦康奈尔(Steve McConnell)讨论了程序员在大型程序中“克服复杂性”的所有方式。他的提示最终体现在: “面向对象的编程提供了同时适用于算法和数据的抽象级别,这是仅功能分解无法提供的那种抽象。” 加上他的结论“降低复杂度可以说是成为有效程序员的最重要的关键”(同一页),这似乎对函数式编程构成了很大的挑战。 FP和OO之间的辩论通常由FP支持者围绕复杂性问题进行,这些复杂性问题特别来自于并发或并行化的挑战。但是并发当然不是程序员必须克服的唯一复杂性。也许专注于减少一种复杂性会在其他方面大大增加它的复杂度,以至于在许多情况下,增加收益是不值得的。 如果我们将FP和OO之间的比较术语从并发性或可重用性等特定问题转移到全局复杂性的管理上,那场辩论会如何? 编辑 我想强调的对比是,OO似乎封装和抽象了数据和算法的复杂性,而函数式编程似乎鼓励在整个程序中使数据结构的实现细节更加“暴露”。 例如,参见Stuart Halloway(Clojure FP的支持者)在这里说,“数据类型的过度规范”是“惯用的OO风格的负面结果”,并主张将AddressBook概念化为简单的矢量或映射而不是更丰富的OO对象。以及其他(非向量化和非地图类)属性和方法。(此外,OO和领域驱动设计的支持者可能会说,将地址簿公开为向量或映射会使封装的数据过度暴露于从域的角度来看无关紧要甚至危险的方法)。

10
抽象类上的接口
我和我的同事对基类和接口之间的关系有不同的看法。我相信一个类不应实现接口,除非在需要实现接口时可以使用该类。换句话说,我喜欢看这样的代码: interface IFooWorker { void Work(); } abstract class BaseWorker { ... base class behaviors ... public abstract void Work() { } protected string CleanData(string data) { ... } } class DbWorker : BaseWorker, IFooWorker { public void Work() { Repository.AddCleanData(base.CleanData(UI.GetDirtyData())); } } DbWorker是获得IFooWorker接口的对象,因为它是该接口的可实例化实现。它完全履行了合同。我的同事更喜欢几乎相同的东西: interface IFooWorker { void Work(); } …

3
“ S”在OOPS中代表什么?
我已经在Google中搜索了“ OOPS ” 的完整形式,但是不幸的是,答案有很多。有人说它是“ 系统 ”,有人说它是“ 结构 ”,甚至有人称它为 “ 概要 ”。 有人能启发我,找到带有正确且正确的参考文献的完整OOPS形式吗? 非常感谢大家,帮助了我。

5
什么时候以及为什么要使用嵌套类?
使用面向对象编程,我们可以在一个类(嵌套类)中创建一个类,但是在我4年的编码经验中,我从未创建过嵌套类。 嵌套类有什么用处? 我知道如果嵌套一个类,则可以将其标记为私有,并且我们可以从包含的类中访问该类的所有私有成员。我们可以将变量作为私有变量包含在包含类本身中。 那么为什么要创建一个嵌套类呢? 在哪些情况下应使用嵌套类,或者在使用方面比其他技术更强大?

8
复制并粘贴长而直接的代码而不是将它们包装到类或函数中是否可以接受?
假设我有一段代码可以连接到互联网并显示类似的连接结果: HttpRequest* httpRequest=new HttpRequest(); httpRequest->setUrl("(some domain .com)"); httpRequest->setRequestType(HttpRequest::Type::POST); httpRequest->setRequestData("(something like name=?&age=30&...)"); httpRequest->setResponseCallback([=](HttpClient* client, HttpResponse* response){ string responseString=response->getResponseDataString(); if(response->getErrorCode()!=200){ if(response->getErrorCode()==404){ Alert* alert=new Alert(); alert->setFontSize(30); alert->setFontColor(255,255,255); alert->setPosition(Screen.MIDDLE); alert->show("Connection Error","Not Found"); }else if((some other different cases)){ (some other alert) }else Alert* alert=new Alert(); alert->setFontSize(30); alert->setPosition(Screen.MIDDLE); alert->setFontColor(255,255,255); alert->show("Connection Error","unknown error"); } }else{ (other handle …

6
您可以在没有class关键字的情况下实现“面向对象”编程吗?
假设我们要提供银行“帐户”的抽象。这是function在Python中使用对象的一种方法: def account(): """Return a dispatch dictionary representing a bank account. >>> a = account() >>> a['deposit'](100) 100 >>> a['withdraw'](90) 10 >>> a['withdraw'](90) 'Insufficient funds' >>> a['balance'] 10 """ def withdraw(amount): if amount > dispatch['balance']: return 'Insufficient funds' dispatch['balance'] -= amount return dispatch['balance'] def deposit(amount): dispatch['balance'] += amount return dispatch['balance'] …

6
创建新对象还是重置每个属性?
public class MyClass { public object Prop1 { get; set; } public object Prop2 { get; set; } public object Prop3 { get; set; } } 假设我有一个对象myObject,MyClass并且需要重置其属性,那么创建一个新对象或重新分配每个属性会更好吗?假设我对旧实例没有任何其他用途。 myObject = new MyClass(); 要么 myObject.Prop1 = null; myObject.Prop2 = null; myObject.Prop3 = null;

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.