2016-04-24 50 views
1

我不是OOP專家,並且(自從學習了鬆散耦合以來)努力尋找以什麼方式實例化對象來引導使用Typescript編寫的應用程序的問題的答案。在Typescript中實例化對象,遵守鬆散耦合

是否可以創建一個「Main」類,其唯一目的是實例化,設置並傳遞應用程序中使用的所有對象?通過取決於FooBar類,這種方法是否違反了OOP原則?如果是這樣,應用程序的入口點會是什麼樣子?

import {Foo} from "./foo-class"; 
import {Bar} from "./bar-class"; 

interface IOptions { 
    amountOfFooObjects: number; 
} 

class Main { 
    private fooObjects: Foo[] = []; 

    constructor(options: IOptions) { 
     this.buildFoo(options); 
    } 

    private buildFoo(options) { 
     for (let i = 0; i < options.length; i++) { 
      this.fooObjects.push(new Foo(new Bar())); 
     } 
    } 
} 
let main = new Main({ amountOfFooObjects: 10 }); 

回答

2

OO明智的你在做什麼是好的,它類似於它是如何在Java例如(除了靜態主函數)。

然而,你可以用typescript/javascript做一些不同的事情。
作爲您Main類應該是一個單身,因爲我假設你打算只有一個它的實例,你可以創建它作爲一個對象:

let main = { 
    fooObjects: [], 
    init: function(options: IOptions) { 
     this.buildFoo(options); 
    }, 
    buildFoo: function(options: IOptions) { 
     for (let i = 0; i < options.amountOfFooObjects; i++) { 
      this.fooObjects.push(new Foo(new Bar())); 
     } 
    } 
}; 
main.init({ amountOfFooObjects: 10 }); 

你也可以有一個接口,它如果您想強制類型:

interface Main { 
    fooObjects: Foo[]; 
    init: (options: IOptions) => void; 
    buildFoo: (options: IOptions) => void; 
} 

let main: Main = { 
    ... 
} 

但因爲你的模塊中是可以簡單地說:

let fooObjects: Foo[] = []; 
function init(options: IOptions) { 
    buildFoo(options); 
} 

function buildFoo(options: IOptions) { 
    for (let i = 0; i < options.amountOfFooObjects; i++) { 
     this.fooObjects.push(new Foo(new Bar())); 
    } 
} 

然後暴露(EXP ort)你想要什麼。然而,如果你想擴展你的這個類,比如爲它提供不同的實現,那麼堅持你現在擁有的東西。

+0

感謝您的全面回答 – Ozrix

+1

@Ozrix np,但考慮到這只是我的看法,您可以通過深入研究'javascript設計模式'來了解更多的想法和選項,隨時瞭解更多信息。 –