這是我第一次使用 TypeScript 和 OOP。我為常見的代理方法創建了一個介面。(買入,賣出,賣出限價,買入限價)
然后我用我的代理 API 實作了這個介面。GBM、Bitso、IB、AmeriTrade 等我想通過在我的端點接收到的字串來實體化正確的類
示例:“/api/broker/:brokername”所以我創建了以下代碼:
class BrokerIgniter {
private instance: any;
constructor(broker: string) {
const brokerClass: any = this.pick(broker);
if(brokerClass) {
this.run(brokerClass);
}
}
run(ctor: new () => IExecution | IGBMExecution) {
this.instance = new ctor();
}
pick(className: string) {
const magicWand: { [K: string]: any } = {
GBM: GBMBroker,
};
if (magicWand[className]) {
return magicWand[className];
}
return null;
}
get execute() {
return this.instance;
}
}
pick 方法中的“magicWand 變數包含在我的 express post 方法中實作我的通用介面的類串列(在這種情況下,目前只有一個..):
const BrokerName = req.params.broker;
if(BrokerName) {
const Broker = new BrokerIgniter(BrokerName);
const hash = Broker.execute.createOrderHash('SPXL *', 100, 1);
super.sendSuccess(res, hash, 'fine');
}
我的問題是:
這是制作我想要的東西的好方法嗎?這有名稱或模式嗎?可以改進嗎?
如果有這個或模式的名稱,您可以命名它以便我可以了解更多資訊嗎?我一直在檢查 javascript 模式,但沒有發現與此相關的內容。
干杯。
uj5u.com熱心網友回復:
您似乎希望能夠string作為代理密鑰傳入,因為這是來自 API 輸入。
這意味著您可以在類之外宣告支持的類及其鍵的串列BrokerIgniter(盡管靜態欄位也可以使用)。
// Sort of guessing at your types here since your example is incomplete.
const brokers: Record<
string,
typeof IExecution | typeof IGBMExecution | undefined
> = {
GBM: GBMBroker
}
brokers這里被鍵入以將任何字串作為索引,并回傳一個IExecution建構式、一個IGBMExecution建構式,或者undefined如果它們的鍵沒有值。
現在BrokerIgniter可以簡單地變成這樣:
class BrokerIgniter {
private instance: IExecution | IGBMExecution | undefined;
constructor(broker: string) {
const brokerClass = this.pick(broker);
if(brokerClass) {
this.run(brokerClass);
}
}
run(ctor: new () => IExecution | IGBMExecution) {
this.instance = new ctor();
}
pick(className: string) {
return brokers[className] ?? null
}
get execute() {
return this.instance;
}
}
操場
也就是說,這似乎有點矯枉過正。這基本上是相同的代碼。
function igniteBroker(brokerKey: string) {
const brokerClass = brokers[brokerKey]
return brokerClass ? new brokerClass() : null
}
而且要簡單得多。也許您打算大量擴展該BrokerIgniter課程。但如果不是,那么簡單的函式式方法將為您提供更好的服務。
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/429041.html
