Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 如何正确构建功能?_Actionscript 3_Oop_Function_Coding Style_Refactoring - Fatal编程技术网

Actionscript 3 如何正确构建功能?

Actionscript 3 如何正确构建功能?,actionscript-3,oop,function,coding-style,refactoring,Actionscript 3,Oop,Function,Coding Style,Refactoring,假设我们有一个类,其中包含一些方法,其中至少有一个具有相当复杂的性质: class Example { public function Example() { } private function complexFunction():void { //Do this //And do that //And of course do that //and do not forget that

假设我们有一个类,其中包含一些方法,其中至少有一个具有相当复杂的性质:

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()”中调用一次。如果更频繁地进行这种“拆分”,那么就很难在所有这些辅助函数之间找到重要的方法

至少这是我一直在经历的事情,清晰性真的因此而受损。这让我想知道你是否知道解决这个难题的方法?肯定有办法或“最佳实践”来处理这个问题?
我梦想着一种将函数组合在一起的方法,或者将次要函数从属于高级函数,而不为此创建一个全新的类。或者就是这样做的?

将一个大函数拆分为多个函数是正确的。假设它不是像
AddOne()
而不是
value++
。尤其是您可能会更频繁地重复的功能可能会很有用

当您的类被多个函数(或长函数)填满时,重新考虑您的类的功能可能是一个好主意。尽量让你的课只上一门课。例如,类的一个好主意是使其与用户相关。可以在那里创建或删除用户。甚至将用户与他们拥有的汽车进行匹配也可以在那里完成。但是不要在用户类中包含保存或删除汽车的函数。将其保存到另一个类中

在这种情况下,示例类将具有User类和Car类的实例。如果它看起来像这样,那么您的编程效率很高:

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);
        ...
    }

有时候,有些课程往往会变大,即使你试图让事情井然有序。这从来都不是坏事,长函数也不是坏事。只要试着把事情分开,试着不要重复太多代码(为此创建函数),并试着把相互关联的事情放在不同的类中。

我个人发现,如果将复杂代码分成简单的函数,它会大大提高代码的可读性。
我在给出的代码中没有真正了解到的是那些简单函数组合成一个函数的方式,这似乎只适用于根本不返回任何内容的函数(它们似乎只是有一些效果)。从简单函数构建复杂函数的更自然的方法是通过函数组合、区分大小写或类似的方式…

仅仅因为函数“长”并不会使其更复杂,有些事情只需要许多行代码。
例如:

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值的方法应该挂起红旗。
将一个方法拆分为单独的助手方法并不能消除当前的问题,实际上会使编译器的情况变得更糟,因为现在它必须为那些只会被调用一次的方法分配资源。 经验法则是避免超过CC值20。
当你超过20岁时,是时候开始重新思考你的课程设计了,因为它正变得紧密耦合

也许你应该问的问题是。

 How can I reduce the Cyclomatic Complexity of this?

我尝试只为可重用代码编写函数。如果一个函数只被一个“主函数”调用一次,我觉得拥有一个函数不是一个好主意。如果注释掉复杂函数,可能更容易阅读…如果在“主函数”中多次调用它?那么显然不应该复制代码,而应该编写函数…不要忘记函数声明中的公共/私有命令;)你使用哪种代码编辑器?我认为发布一个真实的类会对你有所帮助,让你感觉到你描述的方式。是的,我同意。我的例子非常简单。其目的只是为了直观地证明,拥有许多功能使得区分重要功能和辅助功能变得越来越困难。因此,我将继续拆分函数,但也会更频繁地拆分类,因为这有利于清晰性。谢谢你的回答:)。好吧,也许这样的代码在阅读时并不难理解,但我认为如果你不再太熟悉你的代码,仅仅是长度就更难找到你想要的东西。因此,我仍然会将其拆分,并将其替换为自解释函数,如“loadContentAndSetupEventListeners()”。好吧,在那个特定的例子中,这可能没有太大意义,但一般来说,我更喜欢只在我真正想读代码的时候才读代码。这是一个很好的建议!事实上,我能在我的大课上多上几节课。如果除了方法的时间顺序之外,真的没有办法将结构引入到方法的集合中,那么最好是使用更多的类,每个类的责任更小。