簡體   English   中英

ES6類和類實例作為構造函數中的參數

[英]ES6 class and class instance as parameter in constructor

類A需要類B的實例。我應該在A構造函數中創建B實例,還是創建啟動類A的實例並將實例傳遞給A構造函數?

計划A:

class A { constructor() { this.b = new B(); } }

B計划:

const b = new B();

class A() { 
    constructor(b) { 
        this.b = b; 
    }
}

const a = new A(b);

您的Plan B絕對是更好的方法,因為它使您的class A更靈活,並消除了class B工作方式的依賴性。

如果,計划A是可以的

  • B類將來不應該用C類代替

  • B類不使用某些外部依賴,如ajax或數據庫或其他東西。

要么

  • 您的申請是概念證明,或者您實際上是有時間限制的

在所有其他情況下,B計划都很好。

它將為您提供靈活性,可以動態更改A類行為,提供更多通用性,通過模擬此依賴性來幫助進行測試。

所以我會說計划A是關於簡單性的,計划B是關於靈活性和測試。 在每種情況下選擇您需要的任何東西

希望這可以幫助。

第一種策略是合適的,其中兩個類都有一種關系,在這種關系中,它們沒有完全沒有彼此的確切形式,並且子實例沒有特殊的特征,否則會手動提供它們有任何好處。

后一種注入類依賴關系的策略要靈活得多。 這在類型語言中更為明顯,在這種語言中,您可以清楚地定義類抽象或接口來描述對象“看起來像”而不是實際的實現,例如使用TypeScript:

class Process {
  private storage: StorageInterface;

  constructor(storage: StorageInterface) {
    this.storage = storage;
  }
}

interface StorageInterface {
  store(data: any): Promise<void>;
}

這里很清楚,一個Process期望一個提供函數store的東西的實例,但它並不關心實際的實現是什么樣的 - 這是由實現StorageInterface的類決定的:

class PostgresStorage implements StorageInterface {
  public async store(data: any): Promise<void> {
    // do some postgres query
  }
}

class FilesystemStorage implements StorageInterface {
  public async store(data: any): Promise<void> {
    // store in the filesystem
  }
}

現在,我們可以完全靈活地選擇要使用Process實例的“存儲”類型,而不是它自己管理它能夠使用的存儲,創建無限存儲類型而不修改其余代碼庫的能力等等。清晰了解Process與之交互的內容。

// A process that stores something in a Postgres instance.
const processA: Process = new Process(new PostgresStorage());

// A process that stores something on the filesystem.
const processB: Process = new Process(new FilesystemStorage());

在JS世界中,OO方法與強類型經典語言略有不同。 也許這個平台的變化是一個很好的機會來審查你的思維方式,如何重用和思考更多的組合。

https://en.wikipedia.org/wiki/Composition_over_inheritance

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM