哪个更好用,mixin或静态方法来组织长代码

时间:2016-08-31 06:56:10

标签: typescript

我有一个包含长代码的类,现在我想将代码组织到单独的文件中。

我有2个想法,使用Mixin并使用静态方法。

例如,

class myController {
    routeSubView(type: SubViewType, params: any) {
        swtich(type) {
            case SubViewType.A: 
                this._showA(params);
                break;
            case SubViewType.B: 
                this._showB(params);
                break;
            case SubViewType.C: 
                this._showC(params);
                break;
            case SubViewType.D: 
                this._showD(params);
                break;
            // ... a lot more
        }
    }

    private _showA() {
        // initialize view and render
    }

    private _showB() {
        // initialize view and render
    }

    private _showC() {
        // initialize view and render
    }

    private _showD() {
        // initialize view and render
    }

    // ... a lot more
}

#idea1)将生成子视图代码移动到静态类

### sub_views.ts
class SubViews {
    static showA(params: any) {
        // initialize view and render
    }
    static showB(params: any) {
        // initialize view and render
    }
}

### my_controller.ts
import { SubViews } from './sub_views';
class myController {
    routeSubView(type: SubViewType, params: any) {
        swtich(type) {
            case SubViewType.A: 
                SubViews::showA();
                break;
            case SubViewType.B: 
                SubViews::showB();
                break;
            case SubViewType.C: 
                SubViews::showC();
                break;
            case SubViewType.D: 
                SubViews::showD();
                break;
            // ... a lot more
        }
    }
}

#idea2)使用Mixin

### mixin.ts
export interface ISubviews {
    _showA(params: any): any;
    _showB(params: any): any;
    _showC(params: any): any;
    _showD(params: any): any;
}

export function _showA(param: any){
    // initialize view and render
}
export function _showB(param: any){
    // initialize view and render
}
export function _showC(param: any){
    // initialize view and render
}
export function _showD(param: any){
    // initialize view and render
}

### my_controller.ts

import * as { Mixin } from './mixin';

class myController implement Mixin.ISubviews {
    _showA(params: any): any;
    _showB(params: any): any;
    _showC(params: any): any;
    _showD(params: any): any;

    /// ...
}

Cocktail.mixin(myController, Mixin);

哪个更好主意?或任何其他更好的主意?请告诉我。

1 个答案:

答案 0 :(得分:3)

Javascript和Typescript是原型语言,这意味着他们将更经典的OO模型拆分为嵌入,委托和创建。这允许您表达经典模型中不存在的某些强大概念。您的第一个示例更类似于经典OO中的变通方法,您更喜欢组合而不是继承。

在原型语言中,组合仍然优于继承,但您可以更直接地表达它,例如通过mixin(嵌入概念)。我认为你应该总是喜欢使用mixin而不是成员组合。

如果您想深入了解这些概念,请观看Eric Elliot's talk about the three types of prototypal inheritance,如果您想更深入,请查看Luca Cardelli's A Theory of Objects