2016-07-20 4 views
0

полиморфизма Сделки Javascript ООП:ООП Советов, чтобы избавиться от коммутатора заявления с использованием прототипом

Я attemping, чтобы получить лучше ООП в JavaScript и в настоящее время работает над решением ООП для обработки различных типов коммерческих сделок , Покупка, ставка и т. Д.

У меня были все действия продавца в одной стороне оператора if с переключателем для обработки каждого типа транзакции.

Тогда я сделал то же самое для покупателя.

Пройдя это, я улучшил структуру кода, поэтому его легче читать, но я считаю, что «SWITCH» внутри processSellerTransactions и processBuyerTransactions ошибочны.

, если у меня есть все прототипы setup (buy, bid) и т. Д. Я бы хотел просто вызвать функцию прототипа напрямую, не используя инструкцию switch.

Может ли кто-нибудь указать мне в правильном направлении (учебники и т. Д.) Или указать, что я делаю неправильно.

Я получаю это (kindof), но это все еще довольно новый, поэтому любая помощь будет принята с благодарностью.

Заранее спасибо.

var Transaction = function(transactionType) { 
    this.transactionType = transactionType; 
}; 

Transaction.prototype.buy = function(){ 
    console.log("Buy"); 
}; 

Transaction.prototype.bid = function(){ 
    console.log("Bid"); 
}; 

function Type(transactionType, transactionId) { 
    Transaction.call(this, transactionType); 
    this.transactionId = transactionId; 
} 

Type.prototype = Object.create(Transaction.prototype); 

Type.prototype.constructor = Type; 

Type.prototype.processSellerTransactions = function(){ 

    switch(this.transactionType) { 
     case 'buy': 
        console.log('do the buy logic for seller'); 
       break; 
      case 'bid': 
        console.log('do the bid logic for seller') 
       break; 
    } 
}; 

Type.prototype.processBuyerTransactions = function(){ 
    switch(this.transactionType) { 
     case 'buy': 
       console.log('do the buy logic for buyer'); 
       break; 
      case 'bid': 
       console.log('do the bid logic for buyer') 
       break; 
    } 
}; 

var user = 'seller'; 
var transaction_type = 'buy'; 
var transaction_id = '12345'; 

var transaction = new Type(transaction_type, transactionId); 

if(user == seller) 
    transaction.processSellerTransactions();  

if(user == buyer) 
    transaction.processBuyerTransactions(); 

Благодаря Джону за совет о Образцом стратегии. Вот простой пример, в Javascript

Strategy Pattern In Javascript Example

+0

Похоже, вы действительно хотите сделать подкласс 'BuyType' и' BidType' 'Transaction'? – Bergi

+0

Да, я думаю, что возможно. Я хочу делать все, что мне нужно, чтобы быть способным быстро расширяться. Босс - своего рода сумасшедший создатель, так что скажите, что они приходят в tommorow и говорят. «Мы хотим, чтобы люди также задерживали людей». Если бы это было только два, это было бы довольно легко. Я пытаюсь думать о будущих типах транзакций. Buy, Bid, OnHold, Returned, BackOrdered и т. Д. – smugford

ответ

0

Вам нужно сделать TransactionType и абстракции, который знает, как обработать транзакцию, то вы можете использовать Strategy Pattern пройти обработку в TransactionType

Вы можете преобразовать это прототип style

function BidTransactionType(){ 
    this.processSellerTransaction = function(type){ 
    console.log('process seller transaction') 
    } 
    this.processBuyerTransaction = function(type){ 
    console.log('process buyer transaction') 
    } 
} 
function Type(transactionType, 
Type.prototype.processSellerTransactions = function(){ 

    switch(this.transactionType) { 
     case 'buy': 
        console.log('do the buy logic for seller'); 
       break; 
      case 'bid': 
        console.log('do the bid logic for seller') 
       break; 
    } 
}; 
function Type(transactionType, transactionId) { 
    this.transactionType = transactionType; 
    this.transactionId = transactionId; 
} 

Type.prototype.processBuyerTransactions = function(){ 
    transactionType.processBuyerTransaction(this); 
}; 

Type.prototype.processSellerTransactions = function(){ 
    transactionType.processSellerTransaction(this); 
}; 

var user = 'seller'; 
var transaction_type = new BuyerType(); 
var transaction_id = '12345'; 

var transaction = new Type(transaction_type, transactionId); 

Сверху к этому вы можете создавать больше типов транзакций без необходимости использовать chan ge your Type объект, поддерживающий Open/Closed Principle

+0

Да шаблон стратегии - именно то, что я хотел бы. – smugford

0

Вы можете избавиться от этого переключателя заявление, имея BuyerTransaction и SellerTransactionClass. Затем вы перемещаете эту логику внутри другой функции, которая создает правильный тип.

например

function createTransaction(person){ 
if(person === 'buyer'){ 
    return new BuyerTransaction(); 
} 
return new SellerTransaction(); 
} 

var BuyerTransaction = function(){} 
BuyerTransaction.prototype = Object.create(Transaction.prototype); 
BuyerTransaction.prototype.buy = function(){} 
BuyerTransaction.prototype.bid = function(){} 

var SellerTransaction = function(){} 
SellerTransaction.prototype = Object.create(Transaction.prototype); 
SellerTransaction.prototype.buy = function(){} 

//at runtime 
var transaction = createTransaction('buyer'); 
transaction.buy(); 
+0

вот так. – smugford

Смежные вопросы