[英]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方法與強類型經典語言略有不同。 也許這個平台的變化是一個很好的機會來審查你的思維方式,如何重用和思考更多的組合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.