Tag: oop

如果一个“实用程序”类是邪恶的,我在哪里把我的通用代码?

我通常遵循全局variables/函数是邪恶的规则,并且每一段代码都应该存在于它所属的类中。 这是一条非常简单的规则,我相信直到现在我还没有遇到这个规则的问题。 然而,今天,我需要为我的程序集添加一个函数,而不是添加到特定的类。 也就是说,几乎所有的类都可以用于这个特定的function。 我应该在哪里放置这个function(+1重载)? 如果我把它放在“公用事业”课上,我觉得很肮脏。 如果我把它贴到一个半相关的class上,让其他class直接打电话给我,我感觉更糟。 这段代码基本上把一个IList<PointF>切成一个规范化列表。 我现在觉得把它作为IList<PointF>的扩展方法可能是最好的select…

什么是不变性,我为什么要担心呢?

我读过几篇关于不变性的文章,但是仍然没有很好地遵循这个概念。 我最近在这里提到了一个提到不变性的话题,但是因为这本身就是一个话题,所以我现在正在制定一个专门的话题。 我在过去的主题中提到,我认为不变性是指只读取对象并使其可见性较低的过程。 另一位成员则表示,这并没有什么关系。 这个页面 ( 一系列的一部分)使用一个不可变的类/结构的例子,它使用只读和其他概念来locking它。 在这个例子中,状态的定义究竟是什么? 国家是一个我没有真正掌握的概念。 从devise原则的angular度来看,一个不可变的类必须是一个不接受用户input的类,真的只是返回值呢? 我的理解是任何只是返回信息的对象都应该是不可变的,“locking”的,对吗? 所以如果我想用一个方法返回一个专门的类的当前时间,我应该使用一个引用types,因为这将是一个types的引用,因此我受益于不变性。

stream利的界面是否违反了德米特法?

维基百科关于Demeter法律的 文章说: 法律可以简单地表述为“只使用一个点”。 但是stream畅的界面的一个简单的例子可能是这样的: static void Main(string[] args) { new ZRLabs.Yael.Pipeline("cat.jpg") .Rotate(90) .Watermark("Monkey") .RoundCorners(100, Color.Bisque) .Save("test.png"); } 那么这是一起吗?

closures:为什么他们如此有用?

作为面向对象的开发者,也许我很难看到它的价值。 他们给了什么附加值? 他们适合在面向对象的世界吗?

无编程(基本上没有条件)

我有一位同事告诉我,他曾经为一家公司做过工作,他们没有在代码中使用条件语句(“if”和“switch”语句),他们让代码中的所有决定都使用多态性和(我猜)一些其他的OO原则。 我有点理解这个背后的原因,让代码更干,更容易更新,但我正在寻找这个概念的更深入的解释。 或者,也许这是更一般的devise方法的一部分。 如果有人有这方面的资源,或者愿意解释,甚至有更多的相关条款,我可以用来find更多的答案,我会非常感激。 我在SO上发现了一个相关的问题,但是我对C ++不熟悉,所以我不太了解那里的答案。 (我不是OO大师顺便说一句,但我可以pipe理) 我是最擅长的PHP,之后Python,所以我更喜欢使用这些语言的信息。 更新:我会问我的同事更多的信息,他是什么意思。 更新2015年:经过多年的编程经验,我现在看到,这个政策的目的可能是防止程序员通过在某些地方添加条件语句(如果语句)以偶然的方式添加function。 扩展软件的一个更好的方法是使用软件通过inheritance和多态扩展的“打开/closures原则” 。 我强烈怀疑这个政策是否在所有条件下都是超严格的,因为如果没有这个政策,就很难完全走下去。

我应该如何在Python中声明实例variables的默认值?

我应该给我的class级成员这样的默认值: class Foo: num = 1 或者像这样? class Foo: def __init__(self): self.num = 1 在这个问题中,我发现在这两种情况下, bar = Foo() bar.num += 1 是一个明确的操作。 我明白,第一种方法会给我一个类variables,而第二种方法不会。 但是,如果我不需要一个类variables,但只需要为我的实例variables设置默认值,这两种方法同样好? 或者其中一个比另一个更“pythonic”? 我注意到的一件事是,在Django教程中, 他们使用第二种方法来声明Models。 我个人认为第二种方法更优雅,但我想知道“标准”方式是什么。

在C ++中dynamic分派和后期绑定有什么区别?

我最近阅读了维基百科上的Dynamic Dispatch,并且无法理解C ++中dynamic分派和后期绑定的区别。 当每一个机制被使用? 来自Wikipedia的确切引用: dynamic分派不同于后期绑定(也称为dynamic绑定)。 在select操作的上下文中,绑定是指将名称与操作相关联的过程。 调度是指在决定名称所涉及的操作之后,为操作select一个实现。 通过dynamic调度,名称可以在编译时绑定到一个多态操作,但是直到运行时才会select实现(这是dynamic调度在C ++中的工作原理)。 但是,后期绑定确实意味着dynamic调度,因为在select名称引用的操作之前,您不能select要执行多态操作的实现。

虚拟,覆盖,新和密封覆盖之间的区别

在OOP的一些概念之间我很困惑: virtual , override , new和sealed override 。 任何人都可以解释不同之处 我很清楚,如果要使用派生类方法,可以使用override关键字,以便基类方法将被派生类重写。 但我不确定new sealed override 。

为什么Haskell代数数据types“closures”?

纠正我,如果我错了,但它似乎像Haskell中的代数数据types在许多情况下,你会使用面向对象语言的类和inheritance有用。 但是有一个很大的区别:一旦声明了一个代数数据types,就不能在其他地方扩展。 这是“closures”。 在OO中,你可以扩展已经定义的类。 例如: data Maybe a = Nothing | Just a 没有办法,我可以以某种方式添加另一个选项,这种types稍后没有修改此声明。 那么这个系统有什么好处呢? 看来OO的方式会更具可扩展性。

JavaScript中的组合,inheritance和聚合

网上有很多关于组合与inheritance的信息,但是我还没有find像JavaScript这样的好例子。 使用下面的代码来演示inheritance: function Stock( /* object with stock names and prices */ ) { for (var company_name in arguments[0]) { // copy the passed object into the new object created by the constructor this[company_name] = arguments[0][company_name]; } } // example methods in prototype, their implementation is probably redundant for // this question, but list() returns […]