2013-05-03 63 views
1

让我们说我们有它的一些方法,其中至少有一个相当复杂性质的一类:如何正确构造函数?

class Example { 
    public function Example() 
    { 
    } 

    private function complexFunction():void 
    { 
     //Do this 
     //And do that 
     //And of course do that 
     //and do not forget that 
    } 

    private function otherImportantFunction():void 
    { 
     //Do something 
    } 

    //[...] 
} 

现在“complexFunction()”已经成长很长,也有点复杂。因此,增加可读性的一件好事就是在较小的子函数中分割“complexFunction()”。我通常不喜欢这样写道:

class Example { 
    public function Example() 
    { 
    } 

    private function complexFunction():void 
    { 
     doThis(); 
     doThat(); 
     andOfCourseDoThat(); 
     andDoNotForgetThat(); 
    } 

    private function doThis():void 
    { 
     //Do This 
    } 

    private function doThat():void 
    { 
     //Do That 
    } 

    private function andOfCourseDoThat():void 
    { 
     //And of course do that 
    } 

    private function andDoNotForgetThat():void 
    { 
     //And do not forget that 
    } 

    private function otherImportantFunction():void 
    { 
     //Do something 
    } 

    //[...] 
} 

但现在的类是在较小的功能,其唯一目的已经淹死在里面得到调用一次“complexFunction()”。多做一点“分裂”,很难发现所有这些辅助函数之间的重要方法。

至少这是我一直在发生的事情,清晰度真的会受到影响。这让我想知道你是否知道解决这个难题的方法?当然有办法或'最佳实践'来处理这个问题? 我梦想着将功能组合在一起,或者将次要功能从属于上层功能,而不需要为此创建一个全新的班级。或者它是如何完成的?

+1

我试着只编写可重用代码的函数。如果一个函数只被一个“主函数”调用一次,我不觉得有一个函数是一个好主意。如果你注释掉你的复杂功能,它可能会更容易阅读...... – 2013-05-03 12:14:12

+0

如果它在该“主功能”中被多次调用? – 2013-05-03 12:23:41

+0

然后,你显然不应该重复代码,但写一个函数... – 2013-05-03 12:26:10

回答

0

你很对一个大功能分成多个功能。假设它不是像AddOne()而不是value++。特别是你可能会更经常重复的功能可能是有用的。

当你的课堂充满了多个功能(或者长时间的功能)时,重新考虑你的班级做什么可能是一个好主意。尽量让你的课程注定要注册一门课程。例如,一个类的好主意是让它与用户相关。像创建或删除用户可以在那里完成。即使将用户与例如他们拥有的汽车相匹配也可以在那里完成。但是不要在保存或删除Cars的User-class中包含函数。保存一个不同的类。

在这种情况下,您的Example-class将具有User-class和Car-class的实例。如果它看起来像这样,你高效编程:

class Example { 
    function Example() 
    { 
    } 

    function complexFunction():void 
    { 
     Car newCar = new Car("KK-E8", Color.Red, true); 
     carManager.Add(newCar); 
     User newUser = new User("Moritz", "Krohn", Country.Germany, true); 
     userManager.Add(newUser); 
     newUser.addCar(newCar); 
     ... 
    } 

它发生一些类往往会得到大的,甚至当你试图保持组织的事情。这绝不是一件坏事,也不是长期的功能。试着让事情分离,尽量不要重复代码(为此创建函数),并尝试在独立的类中保留与彼此相关的事物。

+0

这是个好建议!事实上,我能够从我的大课堂中创造更多的课程。如果真的没有办法将结构纳入你的年代表以外的其他方法,那么可能最好有更多的班级,每个班级的责任更少。 – 2013-05-04 08:36:19

0

我个人发现,如果将其分解为简单函数,它会提高复杂代码的可读性。 我没有真正得到的代码是这些简单的函数组合成一个函数的方式,这似乎只适用于根本不返回任何东西的函数(它们似乎只有一些效果)。更自然的方式来建立一个复杂的功能,从简单的,将通过功能组成,案例区分或类似的方式......

+0

是的,我同意。我的例子非常简单。意图只是为了直观地表明具有许多功能使得将重要的功能与帮助功能区分开来变得越来越困难。所以,我会继续分解函数,但也会在更清晰的地方分裂类。感谢您的回答 :) 。 – 2013-05-04 08:20:53

0

只是因为一个函数是“长”不会使它更复杂,有些东西只需要很多代码。
举个例子:

var loader:Loader = new Loader(); 
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler); 
loader.contentLoaderInfo.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler); 
loader.contentLoaderInfo.addEventListener(Event.INIT, initHandler); 
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); 
loader.contentLoaderInfo.addEventListener(Event.OPEN, openHandler); 
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressHandler); 
loader.contentLoaderInfo.addEventListener(Event.UNLOAD, unLoadHandler); 
loader.contentLoaderInfo.addEventListener(MouseEvent.CLICK, clickHandler); 
var request:URLRequest = new URLRequest(url); 
loader.load(request); 

是不是 “长”?是
它是否具有较高的循环复杂性?没有
你可以清楚地理解这里发生了什么,它很容易遵循。
而且你会发现低CC值的函数/方法总是会更容易阅读。
另一方面,具有高(+20)CC值的方法应该出现红旗。
将方法拆分为单独的帮助器方法并不能解决问题,并且实际上让编译器变得更糟,因为现在它必须分配专用于那些只会被调用一次的方法的资源。 经验法则是避免超过20的CC值。
当你达到20以上时,现在是时候开始重新思考你的班级设计,因为它变得紧密联系在一起。

也许你应该问的问题是。

How can I reduce the Cyclomatic Complexity of this? 
+0

好吧,也许这样的代码在阅读时并不难理解,但我认为这只是长度,如果你不再了解你的代码,它仍然很难找到你正在寻找的东西。所以我仍然会将它分开,并用一个自解释的函数替换它,如'loadContentAndSetupEventListeners()'。那么,或许这在这个具体的例子中并没有太多意义,但是当我真的想读它时,我更喜欢只读代码。 – 2013-05-04 08:30:59

相关问题