Tag: oop

让setter返回“this”是不好的做法?

在java中使setter返回“this”是好的还是坏主意? public Employee setName(String name){ this.name = name; return this; } 这种模式可以是有用的,因为那样你可以像这样链接setter: list.add(new Employee().setName("Jack Sparrow").setId(1).setFoo("bacon!")); 而不是这个: Employee e = new Employee(); e.setName("Jack Sparrow"); …and so on… list.add(e); …但有点违背标准惯例。 我认为这可能是值得的,因为它可以使这个二传手做一些有用的事情。 我已经看到这种模式使用了一些地方(如JMock,JPA),但它似乎并不常见,并且通常只用于定义非常好的API,这种模式在任何地方都可以使用。 更新: 我所描述的显然是有效的,但是我真正想要的是关于这是否普遍接受的一些想法,以及是否有任何陷阱或相关的最佳实践。 我知道关于Builder的模式,但是我所描述的更多一点 – 就像Josh Bloch描述的那样,它有一个关联的静态生成器类来创build对象。

为什么C ++ STL如此大量地基于模板? (而不是*接口*)

我的意思是,除了它的义务名称(标准模板库)… C ++最初是想将OOP概念提供给C语言。那就是:你可以根据类和类的层次结构来说明一个特定的实体可以做什么(不pipe它是怎么做的)。 由于多重inheritance的问题,一些能力组合更难以描述,而且C ++支持接口的概念有点笨拙(与java等相比),但它在那里(可能是改善)。 然后模板和STL一起发挥作用。 STL似乎采用了传统的OOP概念,并使用模板来代替它们。 应该区分使用模板来概括types的情况,其中types本身与模板的操作无关(例如容器)。 有一个vector<int>是非常有意义的。 然而,在许多其他情况下(迭代器和algorithm),模板化types应该遵循一个“概念”(Input Iterator,Forward Iterator等),其中概念的实际细节完全由模板的实现来定义函数/类,而不是与模板一起使用的类,这是OOP的一些反用法。 例如,你可以告诉这个函数: void MyFunc(ForwardIterator<…> *I); 更新:由于在原来的问题中还不清楚,ForwardIterator可以自行模板化,以允许任何ForwardIteratortypes。 相反,将ForwardIterator作为一个概念。 希望只有通过查看其定义才能获得Forward Iterator,在此您需要查看以下实现或文档: template <typename Type> void MyFunc(Type *I); 我可以赞成使用模板的两个说法:通过为每个使用的types定制编译模板,而不是使用vtables,可以使编译代码更高效。 事实上,模板可以用于本机types。 然而,我正在寻找更为深刻的理由,为什么放弃古典OOP而赞成STL的模板化? (假设你读了那么多:P)

如何将课程标记为已弃用?

可能重复: 如何将方法标记为已过时/已弃用? – C# 你如何标记一个类已过时? 我不想在我的项目中再使用一个类,但不想在两周之前删除它。

你如何devise面向对象的项目?

我正在开发一个大型项目(对我来说),这个项目有很多类,需要进行扩展,但是我不确定如何规划我的程序以及类是如何交互的。 我在几个学期回到了OOD课程,并从中学到了很多东西。 比如编写UML,将需求文档翻译成对象和类。 我们也学习了序列图,但不知何故,我错过了讲座之类的东西,他们并没有真正坚持我。 在以前的项目中,我尝试过使用从课程中学到的方法,但是通常会以代码的forms结束,只要我可以说“是啊,看起来像我脑子里想的那样”,我不想挖掘泥土来添加新function。 我有一个史蒂夫麦康奈尔的代码完成 ,我不断听到是惊人的,在这里和其他地方的副本。 我阅读了关于devise的章节,似乎没有提供我正在寻找的信息。 我知道他说,这不是一个干净的过程,它主要是基于启发式的,但我似乎无法把他所有的信息都应用到我的项目中去。 那么在高级devise阶段(在开始编程之前),你需要做什么来确定你需要什么类(尤其是那些不是基于任何“真实世界对象”的类),以及它们将如何相互交互 ? 具体来说,我感兴趣的是你使用什么方法? 你所遵循的过程是什么,通常是一个好的,干净的devise,将密切代表最终产品?

你如何在C ++中创build一个静态类?

你如何在C ++中创build一个静态类? 我应该能够做到这样的事情: cout << "bit 5 is " << BitParser::getBitAt(buffer, 5) << endl; 假设我创build了BitParser类。 BitParser类定义是什么样的?

这是什么意思,Javascript是一个基于原型的语言?

Javascript的主要优势之一是据说这是一个基于原型的语言。 但是,这是什么意思,Javascript是基于原型的,为什么这是一个优势?

如何将项目从列表中复制到列表中?

如何将包含在一个List的项目转移到另一个C#中,而不使用foreach ?

接口或抽象类:使用哪一个?

请解释什么时候应该使用接口,什么时候应该使用抽象类? 我怎样才能改变我的抽象类到一个接口?

原型inheritance优于古典?

所以这些年我终于停下脚步,决定正确地学习JavaScript。 语言devise中最令人头疼的元素之一就是inheritance的实现。 有了Ruby的经验,我很高兴看到closures和dynamicinput; 但是对于我的生活来说,无法弄清楚使用其他实例进行inheritance的对象实例有什么好处。

凝聚力和耦合

内聚和耦合有什么区别? 耦合和内聚如何导致软件devise的好坏? 什么是一些例子,概述了两者之间的差异,以及它们对整体代码质量的影响?