Resharper喜欢指出每个asp.net页面可以静态化的多个函数.如果我让它们静止,对我有帮助吗?我应该将它们设置为静态并将它们移动到实用程序类吗?
[编辑]
我的原始问题是"为什么要在静态和非静态之间做出决定?两者都是一样的......"
不幸的是,它被编辑成一个C#特定的问题,我真的想避免.
所以,让我做一些补充:
当我说接口时,我不是指C#-keyword接口,而是我理解的东西,比如C++接口:一组定义良好的函数来操作我的对象.当说削弱我的界面时,我的意思是我有不同的功能(静态/非静态)做同样的事情.当有不同的功能来做同样的事情时,我的界面不再明确定义.
所以,正如看门人Bob发布的那样,我可以实现一个Validate()函数
Document.Validate(myDocumentObject);
Run Code Online (Sandbox Code Playgroud)
但是也
myConcreteDocumentObject.Validate();
Run Code Online (Sandbox Code Playgroud)
要返回我的Copy() - 示例可以实现Copy()之类的
myConcreteDocument.Copy(toPath);
Run Code Online (Sandbox Code Playgroud)
但是也
Document.Copy(myConcreteDocumentObject, toPath)
Run Code Online (Sandbox Code Playgroud)
要么
Document.Copy(fromPath, toPath)
Run Code Online (Sandbox Code Playgroud)
当我想到一个文件夹,其中包含属于我的Document的所有文件(在这种情况下,我不依赖于具体的实例 - 但我依赖于其他东西:)).
一般来说,我说的是静态方法,而不是静态类(对不起,如果我忘了推荐).
但正如Anton Gogolev所说,我认为我的文档课不是一个很好的例子而且没有很好的设计,所以我想我必须看看单一责任原则.
我还可以实现某种与DocumentClass一起运行的ManagerClass:
例如:
myDocumentManagerObject.Copy(myConcreteDocumentObject, toPath);
Run Code Online (Sandbox Code Playgroud)
要么
myDocumentManagerObject.Copy(myConcreteDocumentObject, toPath);
Run Code Online (Sandbox Code Playgroud)
但是,如果我参考方法1)我倾向于创建自己执行任务的对象,而不是使用我的DocumentObject 执行某些操作的其他对象(DocumentManager).
(我希望这不会采取关于OOP的宗教讨论的方向;).)
[/编辑]
起初这似乎是一个非常基本的问题,比如"何时使用静态方法,何时不使用",但这是我偶尔遇到的问题(我很难描述真正的问题是什么;也许只是为了得到原因(不)使用1)或为什么(不)使用2)).
(虽然我使用的是C#-Syntax但这不是C#限制的问题)
在OOP中,有两种处理对象的方法(以及其他方法):
1)如果我想要我的对象做某事,我只是告诉他这样做:
myConcreteObject.DoSomething();
Run Code Online (Sandbox Code Playgroud)
这就像和一个对象交谈一样.
2)或者如果你是静态方法的粉丝:
ObjectClass.JustDoIt();
Run Code Online (Sandbox Code Playgroud)
在某种程度上,我认为静态函数只是"感觉"更好.所以我倾向于经常使用静态方法(独立于具体实例 - 独立性总是好事).
所以,在设计课程时,我经常要决定是采用方法1)还是方法2):
想象一下,你有一个"文档"类,它应该代表一个应该保存到数据库中的文档:
一个文件
现在我遇到了几种创建这个类的方法:
//----- 1) non static approach/talking to objects -----
Document newDocument = new Document();
// Copy document to x (another …Run Code Online (Sandbox Code Playgroud)