2017-02-06 2 views
0

У меня есть класс карты:Лучшая практика проектирования для разделения общего кода?

function Card() { 
    this.image = new Image(); 
    this.x = 0; 
    this.y = 400; 

    this.initialX = 0; 
    this.initialY = 0; 

    this.scaleFactor = 4; 

    this.setImage = function(ii){    
     this.image.src = ii;    
    }; 

    this.getWidth = function(){   
     if (this.image == null){ 
      return 0; 
     }    
     return this.image.width/this.scaleFactor;   
    } 

    this.getHeight = function(){     
     if (this.image == null){ 
      return 0; 
     }    
     return this.image.height/this.scaleFactor;   
    }   

    this.pointIsInCard = function(mx, my){    
     if (mx >= this.x && mx <= (this.x + this.getWidth()) && my >= this.y && my <= (this.y + this.getHeight())) 
     {     
      return true;       
     } 
     else{     
      return false; 
     }    
    };   
};  

я тогда класс палубы:

function Deck(x, y, w, h){  
    this.x = x; 
    this.y = y; 

    this.width = w; 
    this.height = h;   

    this.cards = [];   
} 

Мне нужно добавить метод в Deck класса аналогично pointIsInCard вместо этого он будет называться pointIsInDeck. Логика будет такой же, чтобы проверить, попадает ли переданная точка в границу объекта. Поэтому, увидев это дублирование кода, я хотел знать, что такое хорошая практика проектирования, чтобы избежать этого дублирования? Один из вариантов, о котором я думал, заключался в том, чтобы извлечь метод и создать функцию для общего объекта с x, y, width, height, но опять же из принципов ООП я думал, что этот метод должен принадлежать классу/объекту. Я ценю любую помощь! Благодаря!

+0

Have Helper класс, где вы передаете объект для поиска, координаты точки, ш и ч. – Justinas

+0

Являются ли параметры одинаковыми для каждой функции? – guest271314

+0

Или у вас есть супер/предок как колоды, так и карты, у которой есть метод. – RobG

ответ

3

Общий подход к тому, что вы делаете, чтобы присоединить экземпляр Rectangle или сходные с этой функциональностью оба ваших объектов, то есть:

class Rectangle { 
    constructor(x, y, width, height) { 
     this.x = x; 
     this.y = y; 
     this.width = width; 
     this.height = height; 
    } 

    containsPoint(x, y) { 
     return x >= this.x && x =< this.width && 
      y >= this.y && y =< this.height; 
    } 
} 

Тогда просто добавьте его в Card и Deck:

function Card() { 
    this.rect = new Rectangle(/* Your card shape */); 

    // ... 
} 

function Deck() { 
    this.rect = new Rectangle(/* Your deck shape */); 

    // ... 
} 

И вы можете сделать:

card.rect.containsPoint(); 
deck.rect.containsPoint(); 
+0

ok Мне нравится этот подход. Мне нравится состав над наследованием. Думаю, я пойду с таким подходом. – kofhearts

+0

возможно, вместо этого. Я могу назвать его границей, которая, на мой взгляд, более описательна. что вы думаете? – kofhearts

+0

@ user734861 Конечно, все, что подходит вашему приложению. – Marty

1

Если это классы, связанные с рисунком, они оба наследуют от чего-то вроде Rectangle, из которого они оба наследуют это поведение.

Если они связаны с геймплеем, я бы предпочел, чтобы они ссылались на Rectangle (или его подкласс), чтобы они делегировали все связанные с UI задачи; затем уменьшите это до решения предыдущего абзаца.

0

Вы можете использовать Function.prototype.call() установить this при вызове функции

function Card() { 
    this.x = 1; this.y = 2; 
}; 

function Deck() { 
    this.x = 10; this.y = 20; 
} 

function points(x, y) { 
    // do stuff 
    console.log(x, this.x, y, this.y); // `this`: `c` or `d` 
} 

var c = new Card(); 

var d = new Deck(); 

points.call(c, 3, 4); // `this`: `c` within `points` call 

points.call(d, 100, 200); // `this`: `d` within `points` call 
Смежные вопросы