如何“优雅”地给你的类命名

来源:互联网 发布:怎么查看我的淘宝店铺 编辑:程序博客网 时间:2024/04/30 06:03

本文是翻译NOVODA上的一篇博客“This one simple change for better class naming will blow your mind”楼主读了该大神的博客后深受启发,故翻译了此文~楼主捉急的英文水平还望各位看官海涵~翻译不足之处还请各位多多指出~原文链接在文章末尾,感兴趣的童鞋可以看看

当我们在对一个类进行命名的时候,通常需要经过各方面的考虑,而MVP模式的命名就是一个教你如何对类进行正确命名的好例子。当然这篇文章不会涉及到怎么实现Model、View或者Presenter,但是通过这篇文章,你可能对你接口的命名会有新的想法。这篇文章的你能获得的好处是,你可以通过对含有多个类的组类进行命名的idea应用到你对其他的类进行命名(似乎读起来有点绕~)。

“Many people try to come up with a great name all at once. This is hard and rarely works well. The problem is that naming is design: it is picking the correct place for each thing and creating the right abstraction. ”

好的,废话不多说,下面来看看这个接口TweetsView,如果让你来写一个实现它的类,你会怎么命名?TweetsViewImpl implements TweetsView。 Excuse me?你确定实现类叫TweetsViewImpl?命名一个实现类是一个很重要的机会去传达你这个类具体要实现什么,要是只在后面加一个Impl而不去想这个类实现什么,这也太懒了吧 : )

这些人会说:“My interface name describes the behaviour of my class. I can’t think of anything more to add to that, I’ll just use Impl. ”

你希望你的类在被命名后描述他的行为,那你就应该遵循单一职责的原则,知道他的职责/行为是什么。

这里有两种解决办法:

1:Only 1 implementer of the interface? Get rid of the interface! Over abstraction is unnecessary and confusing.
2:Understand the problem space and name explicitly according to behaviour TrendingTweetsView implements TweetsView

现在从另一个角度去想想给一个类或接口命名,如果我们使用MVP模式,并且有一个接口给TweetsView,TweetsModel,TweetsPresenter,然后事实上这三个接口是相互关联的,并且应该被考虑作为一个系统的,例如:有人新建了一个代码库,然后他看到了TweetsView,可能他会认为这是一个自定义的View而不是MVP,然后他又看到了其他代码实现了TweetsModel,他依然觉得这可能是另一个设计模式而不是MVP模式,直到他看到了TweetsPresenter,他才会把这三个联系到一起。

如果我们能在代码中将这个分组明确,那将会非常nice. 下面我们看具体代码:

public interface TweetsMvp {    interface Model {    ...    }    interface View {    ...    }    interface Presenter {    ...    }}

我们在一个共有的名字下定义了我们的接口三件套,这样解决了我们理解系统的问题,任何接手的人读到这段代码或者读到实现这其中任何一个接口都能明白这个接口来自接口三件套,并且清楚地知道它是使用MVP这个设计模式来实现的。

public class TweetsModel implements TweetsMvp.Model {...}public class TweetsView implements TweetsMvp.View {...}public class TweetsPresenter implements TweetsMvp.Presenter {...}

当我们实现了这一套接口,将进一步知道我们所用的设计模式是MVP模式。并且我们也解决了Impl命名问题,我们这下可以定义Tweets的View叫做TweetsView,并实现Tweets的MVP里的View接口,TweetsView implements TweetsMvp.View
如果你只是简单地称接口为某某View,Model,Presenter这是不行的,首先你通常会有大量的MVP 接口在你的代码库里,因此这种通用的命名很快就混乱了,其次,在Android中View已经被用在UI系统中了,如果再加入以View命名的类或接口,如果不能完全符合规范的话,将会对代码造成干扰。

希望这个分组的概念能对你有帮助,尽管文字可能有点不容易理解,但代码应该显而易见了。

永远要记住要将你的系统作为一个整体,而作为系统的每部分都应该关联到一起,而这些关系应该被明确。命名在你的代码库里扮演着很重要的角色,能正确get到这个技能也是很难的。想一想你自己在以下七个阶段中,你想处于哪一个:missing name, nonsense naming, honest naming, honest and complete, does the right thing, intent, domain abstracted ,想想其他的实体修改此名称会有什么影响。

翻译原文在这里哟~点我就行啦~
原文中有些句子感觉自己翻译出来就不是原味了~所以有的句子直接给了英文原文~希望大家自己意会啦 :)

0 0