Tag: oop

为什么Java中的属性可以公开?

正如大家所知,Java遵循面向对象的范式,数据封装说,对象的字段(属性)应该为外部世界隐藏,只能通过方法访问,或者方法是外部类的唯一接口世界。 那么为什么有可能将Java中的一个字段声明为public,这将违背数据封装的范式?

一个对象是否应该把自己写到一个文件中,或者另一个对象是否应该用它来执行I / O?

注意:对于长问题抱歉! 我试图理解面向对象背后的一些关键领域,我不能以某种方式来决定我的特定问题。 假设我有一个充满可爱数据的对象。 classbob。 Bob myBob = new Bob("This string is data"); 假设我想将myBob的内容保存到一个xml文件(bob.xml) 我应该有一个对象作用于鲍勃写出的内容,或者我应该有myBob做这个? 案例1:对目标行事 Writer myWriter = new Writer(myBob, "C:\\bob.xml"); 情况2:保存方法 myBob.Save("C:\\bob.xml"); 有些人正在select一个选项,因为这意味着如果写入文件的代码改变了,不需要在每个Save方法中更新; 促进代码重用我想。 我的问题是获取所有数据的对象可能有私人数据没有访问者。 scheme2的情况是该方法仅对对象所持有的数据起作用,这就是应该的方式。 没有其他物体的干扰。 或者是我的问题的“案件依赖”问题之一的答案? 如果是这样,你怎么知道一种方法比另一种方法更受欢迎?

从构造函数调用setter

什么是从build设者(如果有的话)调用一个增变器的pro和con, 即: public MyConstructor(int x) { this.x = x; } 与: public MyConstructor(int x) { setX(x); } public void setX(int x) { this.x = x; } 你有偏好吗? (这不是家庭作业,只是看着我们的编码标准文档,它总是在构造函数中设置实例var的时候调用mutators,我不总是这样)

将unit testing作为正在testing的类的朋友有什么不好?

在C ++中,我经常把一个unit testing类作为我正在testing的类的一个朋友。 我这样做是因为我有时觉得需要编写一个私有方法的unit testing,或者我想访问一些私有成员,这样我可以更容易地设置对象的状态,所以我可以testing它。 对我来说,这有助于保持封装和抽象,因为我不修改该类的公共或受保护的接口。 如果我购买第三方库,我不希望它的公共接口受到一些公共方法的污染,我不需要知道,因为供应商想unit testing! 我也不需要担心一群受保护的成员,如果我从一个class级inheritance,我不需要知道这些成员。 这就是为什么我说它保留了抽象和封装。 在我的新工作中,他们甚至对unit testing也不喜欢使用朋友class。 他们说,因为class级不应该“知道”有关testing的任何事情,而且你不希望class级与testing紧密结合。 有人可以向我解释这些原因,以便我可以更好地理解? 我只是不明白为什么使用朋友进行unit testing是不好的。

了解IoC容器和dependency injection

快速前进: 我写这个的目的是为了更好地理解dependency injection和IoC容器,也是为了以后我可以纠正它的错误,并用它来帮助我的几个朋友教他们。 到目前为止,我已经尝试阅读各种框架(laravel,fuel,codeigniter,symfony)的文档,我发现框架有太多不同的方面,我需要使用它,我决定尝试在尝试在框架中使用它们之前,先自己学习每个主要部分。 我花了几个小时search各种各样的意思,看着stackoverflow响应,并阅读各种文章试图了解什么是IoC,以及如何使用它来正确pipe理依赖关系,我相信我明白它在概念上是什么,但我仍然灰色关于如何正确实施。 我认为读这本书帮助我的最好方法是给出我目前对IoC容器和dependency injection的理解,然后让那些比我更好理解的人指出我的理解力不足。 我的理解: 依赖关系是当ClassA的实例需要ClassB的实例来实例化ClassA的新实例时。 dependency injection是当ClassA通过ClassB的构造函数中的参数或通过set〜DependencyNameHere〜(〜DependencyNameHere〜$ param)函数传递ClassB的实例时。 (这是我不完全确定的领域之一) 。 一个IoC容器是一个单例类(在任何给定的时间只能有一个实例实例化),在这里可以注册实例化这个类的对象的具体方法。 下面是我想要描述的一个例子的链接,以及我一直使用的IoC容器的类定义 所以在这一点上,我开始尝试使用IoC容器更复杂的情况。 到目前为止,似乎为了使用IoC容器,我仅限于几乎所有我想创build的具有IoC容器中定义的依赖关系的类的关系。 如果我想创build一个inheritance一个类的类,但是只有在以IoC容器中注册的特定方式创build父类的情况下。 例如:我想创build一个mysqli的子类,但是我想在IoC容器中注册这个类,只用我之前在IoC容器中注册的方式实例化父类。 我想不出没有重复代码的方法(因为这是一个学习项目,我试图尽量保持它的“纯”)。 以下是我想描述的更多的例子。 所以这里是我的一些问题: 我想尽量做到不违反OOP原则? 我知道在c + +我可以使用dynamic内存和复制构造函数来完成它,但我一直无法在PHP中find这种function。 (我会承认,除了__construct之外,使用其他任何魔术方法的经验都很less,但是如果我理解正确的话,可以从阅读和__clone中获得,我不能在构造函数中使用它来实例化子类,父类的实例)。 我的所有依赖类定义应该在哪里与IoC相关? (我的IoC.php应该在顶部有一堆require_once('dependencyClassDefinition.php')吗?我的直觉反应是有更好的方法,但我还没有拿出一个) 我应该在什么文件注册我的对象? 目前在类定义之后,在IoC.php文件中完成对IoC :: register()的所有调用。 在我注册一个需要依赖关系的类之前,是否需要在IoC中注册依赖关系? 由于我没有调用匿名函数,直到我真正实例化了一个在IoC中注册的对象,我猜不到,但它仍然是一个问题。 还有什么我可以忽略,我应该做的或使用? 我试图一次一个脚印,但我也不想知道我的代码是可重用的,最重要的是,对我的项目一无所知的人可以阅读并理解它。 我知道这是非常长的,只是想提前感谢任何花时间阅读的人,甚至更愿意分享他们的知识。

build设者总是要公开吗?

我的第一个问题是 – class Explain() { public Explain() { } } 应该构造函数总是宣布为公共? 如果我创build一个private构造函数呢? 我总是看到build设者是隐含public 。 那么为什么private构造函数是有用的? 或者根本没有用处 因为没有人能够调用它,或者从来没有一个对象(因为private构造函数)! 这是我的第二个问题。

我如何在Python中实现接口?

public interface IInterface { void show(); } public class MyClass : IInterface { #region IInterface Members public void show() { Console.WriteLine("Hello World!"); } #endregion } 我如何实现这个C#代码的Python等价物? class IInterface(object): def __init__(self): pass def show(self): raise Exception("NotImplementedException") class MyClass(IInterface): def __init__(self): IInterface.__init__(self) def show(self): print 'Hello World!' 这是一个好主意吗?? 请在答案中给出例子。

重构Singleton过度使用

今天,我顿悟了一下,那是我一切都做错了。 一些历史:我inheritance了一个C#应用程序,这实际上只是一个静态方法的集合,是一个完全程序化的C#代码。 我重构了当时我所知道的最好的,带来了大量的大学后OOP知识。 长话短说,代码中的许多实体变成了单身人士。 今天我意识到我需要3个新的类,每个类都遵循相同的单例模式来匹配其余的软件。 如果我一直摔倒这个滑坡,最终我的应用程序中的每一个类都将是单例,这与单独的静态方法在逻辑上没有任何区别。 我需要帮助重新考虑这个问题。 我知道dependency injection,这通常是用来打破单身诅咒的策略。 不过,我有一些与重构有关的具体问题,以及所有关于这样做的最佳实践。 如何使用静态variables来封assembly置信息? 我有一个使用静态的大脑,我认为这是由于在大学早期的OOclass,教授说静态是坏的。 但是,每次我访问它时,是否需要重新configuration这个类? 在访问硬件时,可以将静态指针留给所需的地址和variables,还是应该继续执行Open()和Close()操作? 现在我有一个方法作为控制器。 具体来说,我不断轮询几个外部仪器(通过硬件驱动程序)的数据。 如果这种types的控制器应该走的路,或者我应该在程序启动时为每个仪器产生单独的线程? 如果是后者,我如何使这个对象为导向? 我应该创build名为InstrumentAListener和InstrumentBListener类吗? 还是有一些标准的方法来处理这个? 有没有更好的方法来做全球configuration? 现在我只需将Configuration.Instance.Foo散布在整个代码中。 几乎每个class级都使用它,所以也许保持它作为一个单身人士是有道理的。 有什么想法吗? 很多我的类都是像SerialPortWriter或DataFileWriter这样的东西,它们必须等待这些数据stream入。由于它们一直处于活动状态,我应该如何安排这些以便监听数据传入时产生的事件? 任何其他资源,书籍或有关如何摆脱单身人士和其他模式过度的评论将是有帮助的。

所有静态方法的类有什么问题吗?

我在做代码审查,碰到一个使用所有静态方法的类。 入口方法需要几个参数,然后开始调用其他静态方法传递入口方法收到的全部或部分参数。 它不像一个math课程,与很大程度上不相关的效用函数。 在我自己的正常编程中,我很less写Resharperpopup的方法,并说“这可能是一个静态方法”,当我这样做时,他们往往是无意识的实用方法。 这种模式有什么问题吗? 如果一个类的状态被保存在字段和属性中,或者使用参数在静态方法中传递,这只是个人select的问题吗? 更新 :正在传递的特定状态是数据库的结果集。 该类的职责是从数据库的结果集中填充一个Excel电子表格模板。 我不知道这是否有所作为。

如何在Java中需要一个方法参数来实现多个接口?

在Java中这样做是合法的: void spew(Appendable x) { x.append("Bleah!\n"); } 我该怎么做(语法不合法): void spew(Appendable & Closeable x) { x.append("Bleah!\n"); if (timeToClose()) x.close(); } 我希望如果可能的话,强制调用者使用Appendable和Closeable的对象,而不需要特定的types。 有多个标准类可以做到这一点,例如BufferedWriter,PrintStream等 如果我定义我自己的界面 interface AppendableAndCloseable extends Appendable, Closeable {} 这将不起作用,因为实现Appendable和Closeable的标准类不会实现我的接口AppendableAndCloseable(除非我不了解Java以及我认为的…空接口仍然增加超越其超接口的唯一性)。 我能想到的最接近的是做下面的一个: select一个接口(例如Appendable),并使用运行时testing来确保参数是其他instanceof 。 下行:编译时没有发现问题。 需要多个参数(捕获编译时正确性,但看起来很傻): void spew(Appendable xAppend, Closeable xClose) { xAppend.append("Bleah!\n"); if (timeToClose()) xClose.close(); }