试图把一个方法,在正确的地方,当迷失在OOP joungle等
这并不是说我不理解OOP的概念,应该怎样做时,但有时我只是精神上迷失在那。试图把一个方法,在正确的地方,当迷失在OOP joungle等
从一个例子中还有什么更好的?所以我需要下载一个文件到一个临时路径,因为不相关的原因,我决定不使用普通的网络方法来获取临时路径。所以我写了自己的方法string GetTempFileSafe(string extension, out FileStream)
,很好,不是吗?但是,嘿,等一下,这是不适合这种方法的地方......这种方法可能用于其他的事情。它需要成为一个静态的公共方法。但是哪里?好吧,我想我需要为它打开一个新的静态类。希望有一天我会添加更多的方法。
所以我定义了public static class FileStreamUtils \\one hell of a name huh?
,并添加了我的方法。但坚持..这个班应该在哪里?基本上我可以从任何项目中使用......它与这个特定的项目无关。于是我打开了一个全新的库,我称之为MyUtils
。
我说我的静态类,我的一个单一的静态方法进去,建库,添加DLL作为我原来计划的参考...和它。 (注意该方法更难以调试,因为我使用的DLL,而不是原来的代码)
现在不要误会我的意思。我从字面上很喜欢面向对象的概念和整洁,但有时候它只是在精神上耗尽我的时间......也许是因为我自己都在努力。
那么你怎么看?我只是为了一无所有而哭泣,像打开一个实用程序库这样的事情大都是一次完成的,我只需要改变我的态度?或者你认为有时候最好不要坚持那么整洁(例如,在我的情况下,只是在那里生活的方法,我会再次需要它,将它移动到公共使用)?
非常感谢。如果你能成功找到一个理由来投票给我,没问题,但请你留言,这样我就不会在这里重复我的错误了。
我总是怎么就一点罗伯特玻璃Rules of Three在这些情况感到震惊。除非你有三个地方可以使用你的功能,否则不要担心重复使用。我总是喜欢在我第一次需要它的时候写这个函数。请注意,我第二次复制它。第三次做重用工作(将其重构为实用程序库)。
说实话,你所做的并不正确。然而,你所做的以及我所看到的很多东西都是人们对如何完成这些事情感到恐慌,然后把重点放在工作中,制作出一些很酷的软件来做一些很酷的功能。
在您的特定情况下,你没有需要一个类库因为只有一个功能,所以我只是坚持在Helper类。但是,如果你打算增加很多有用的功能,那么类库是反复使用代码的好方法。但是不要将太多的图层添加到不需要它的应用程序中。
我的一般经验法则是,每次我用至少一个参数编写静态方法时,都是代码异味。
在面向对象,操作应与对象,所以不是从一个辅助库操纵一个或多个对象,最好的方法移动到对象之一。
我知道这是不可能的,如果你正在使用BCL的内置类型,但气味应该让你开始考虑替代品。
让我们看看您的示例:您无法将GetTempFile安全保护添加到System.String和FileStream中,但是是否有任何参数表示隐藏的概念,可以将其更好地模拟为对象?
虽然我不知道这是否是你的榜样真实的,但“扩展”听起来像是一个概念给我,那么为什么不定义一个扩展类是这样的:
public class Extension
{
private readonly string extension;
public Extension(string extension)
{
// Guard Clauses go here
this.extention = extension;
}
public string GetTempFileSafe(out FileStream)
{
// implementation goes here, using this.extension...
}
}
作为下一个步骤,您可以通过将结果字符串和FileStream封装在一个新对象中来更改此API以摆脱out
参数。
“扩展”是一个地方,我会去寻找一种方法,创建一个临时文件。对我来说你正在做的是强制OOP在一个完美的独立实用功能上。 – SoftMemes 2009-10-26 13:41:24
@Freed:我没有强迫任何东西 - 我只是试图用一个例子来说明如何重新考虑效用函数到适当的对象中,可能会发现更好的建模为对象的隐式概念。 – 2009-10-26 13:51:52
= \扩展我的意思是'.doc'或类似的东西。文件名不重要,但是这是。关于你的代码....我不知道..你建议为每个临时文件创建一个新的实例吗?听起来很奇怪..但是也许= \ – Letterman 2009-10-26 14:11:49
显然你说的C#,我不知道,我主要是一个Java的人,这些天,也许有一个技术差,但是......
在Java中,你可以把你的类成“套餐”。您可以同时编译多个软件包,将它们保存在一个IDE等中,但也很容易将其分解出来。
当我写的一组我想我可能会想重新使用类,所以我把它们放在一个单独的包。我仍然把它们作为同一个项目的一部分,除非我真的想在其他地方使用它们。如果发生这种情况,那么我会将该软件包复制到自己的项目中,并从中建立一个库。
因此在开发过程中它仍然是同一项目的一部分,仍然在同一个工作区等,所以很方便地调试和一般跟踪。
如果我从来没有在别处使用它,找到,没有任何伤害。
如果我确实在其他地方使用它,那么有时候我很懒,只是将软件包复制到新项目中。偶尔我真的把它变成一个独立的库。 (当我说“偶然”时,我认为在现实生活中我的意思是我在过去的十年中这样做了两次。)
就像我说的,我不知道C#如何分组事物,是否有简单的方法将一组课程分成一些方便的“单元”。
添加的东西到Jason's answer:
此外,这就是为什么日常会议,结对编程,代码审查是。在这些非正式会议中,你说你已经做了什么(创建了一个临时文件)给团队,所以如果有人已经完成了它,或者他们也需要它,你就知道你必须重构成一个实用程序库。否则你只是把方法留在那里。
我知道你提到你一个人工作,但沟通是避免代码重复和很多这些code smells,所以这个建议主要是团队,而不是独立的程序员。
重构是好的。虽然你可能不想从阅读this thesis about refactoring开始,但这是一个很好的阅读,并且全部都是透视的。您可能还想查看https://stackoverflow.com/questions/441896/how-to-be-master-in-c-and-object-oriented-technology的答案,其中有一本关于重构的书。
底线是,您不必将所有代码放在正确的位置并以正确的方式进行组织。做一些现在足够好的事情,在列表中记下可能的重构列表,当你有一些时间时,通过列表并重新看看代码。也许够好,够好。如果没有,请帮助代码将EVOLVE变得更好。
+1由于有球承认这个东西有时会变得混乱;特别是在精英主义如此盛行的领域。 – Stimul8d 2009-10-26 13:40:36
关于使其更难以调试,听起来就像引用了二进制DLL。为什么不将公用事业项目添加到您的解决方案中,而是参考项目? – SoftMemes 2009-10-26 13:44:58
@Freed,它复制项目还是参考它?如果我更改库,是否所有使用它的项目都会更新? – Letterman 2009-10-26 14:03:54