ค้นหาเว็บไซต์

typescript - ควรใช้แบบไหนดีกว่า ระหว่าง mixin หรือ static method สำหรับจัดการโค้ดยาว


ฉันมีคลาสซึ่งมีโค้ดยาว และตอนนี้ฉันต้องการจัดระเบียบโค้ดเหล่านั้นให้อยู่ในไฟล์แยก

ฉันมีไอเดีย 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

Javascript และ Typescript เป็นภาษาที่ใช้ต้นแบบ ซึ่งหมายความว่าพวกมันแยกรูปแบบ OO แบบคลาสสิกออกเป็นการฝัง การมอบหมาย และการสร้าง ซึ่งช่วยให้คุณสามารถแสดงแนวคิดที่ทรงพลังบางอย่างที่ไม่มีอยู่ในรูปแบบคลาสสิก ตัวอย่างแรกของคุณใกล้เคียงกับวิธีแก้ปัญหาใน OO แบบคลาสสิกมากกว่า ที่คุณให้ความสำคัญกับการประกอบมากกว่าการสืบทอด

ในภาษาที่ใช้ต้นแบบ การรวมยังคงเป็นที่ต้องการมากกว่าการสืบทอด แต่คุณสามารถแสดงมันได้โดยตรงมากขึ้น เช่น ผ่านมิกซิน (แนวคิดการฝัง) ผมคิดว่าคุณน่าจะควรเลือกมิกซินเสมอแทนที่จะรวมสมาชิก

หากคุณต้องการเจาะลึกเข้าไปในแนวคิดเหล่านี้ ให้ดูการบรรยายของ Eric Elliot เกี่ยวกับสามประเภทของการสืบทอดแบบ prototype และหากคุณต้องการเจาะลึกกว่านั้น ให้ดู A Theory of Objects ของ Luca Cardelli