2013-02-14 4 views
0

Хорошо, из-за плохой конфигурации на стороне сервера Ответ У меня возникли проблемы с поиском эффективного способа написания кода.
Поскольку пример, который я пытаюсь передать, довольно сложный, я попытаюсь использовать пример реальной жизни, чтобы помочь.Ищете правильный шаблон проектирования

Так что скажем, что я отвечаю за программу спортивных наград, и я пытаюсь создать «страницу лучших спортсменов». На странице будут показаны лучшие мужские и женские спортсмены из категории из трех видов спорта; бейсбол, баскетбол и футбол. Твист к этому заключается в том, что может быть один победитель мужского пола, а не победитель женского пола, наоборот, или вообще нет победителей. Кроме того, женщина может быть только бейсболистом или баскетболистом, в то время как мужчина может быть либо из трех, либо как баскетболистов, так и футболистов. Нет никакой комбинации бейсбола ни с чем другим. Наконец, если есть мужчина и женщина, женщина должна быть показана первой. Все три категории имеют разные атрибуты, например, футбол имеет атрибут «tds = 43» по сравнению с бейсболом «Homeruns = 32».

Так путаница вступает в игру с ответом сервера:

<player> 
    <baseballList> 
    <baseball 
    name="Adam" 
    sex="male" 
    HomeRuns="32" 
    reward="True"/> 
</baseballList> 
<basketballList> 
<basketball 
    name="John" 
    sex="male" 
    Points="322" 
    reward="False"/> 
    <basketball 
    name="Sandra" 
    sex="female" 
    Points="332" 
    reward="True"/> 
    </basketballList> 
    <footballList> 
    <football 
    name= doug 
    Touchdowns= 33 
    sex=male 
    reward="false"/> 
    </footballList> 
</player> 

(если имя игрока соответствует как для футбола и баскетбола и мужчины, когда вы бы объединить 2) Как вы видите ответ отправляет обратно игроков, которые не представляют интереса (не спрашивайте, почему), которые я должен отфильтровать, а также не объединяет данные, когда у игрока есть несколько видов спорта. Итак, для моего подхода у меня есть обработчик xml-обработчика, который отправляет xml указанному обработчику «Игроков». Какой будет выглядеть примерно так:

public class PlayerHandler implements XmlHandler { 

private static PlayerHandler handler = new PlayerHandler(); 

private PlayerHandler() { 

} 

public static PlayerHandler getInstance() { 
    return handler; 
} 

public void load(String localName, String qName, Attributes attributes) { 
    if (localName != null && attributes != null) { 
     if  (localName.equalsIgnoreCase("football")||localName.equalsIgnoreCase("baseball")||localName.equalsIgnoreCase("basketball")) { 
Player player = new Player(); 

if (localName.equalsIgnoreCase("football")) 
player.category = "football" 
player.TouchDowns=attributes.getValue("TouchDowns"); 

else if (localName.equalsIgnoreCase("baseball")) 
    player.HomeRuns=arrtibutes.getValue("HomeRun"); 
    player.category = "baseball" 

else{ 
    player.category = "basketball"; 
    player.Points=attributes.getValue("Points");} 

    player.sex=attributes.getValue("sex"); 
    player.name=attributes.getValue("name"); 
} 
playerSorter.addPlayer(player);}} 

Я создал один файл класса для объектов:

public class Player implements Serializable{ 
    public String category; 
    public String rewards; 
    public String TouchDowns; 
    public String Points; 
    public String HomeRuns; 
    public String sex; 
    public String Name; 
} 

Я делаю все мои сортировки с классом под названием «playerSorter» с методом addPlayer(), что заполняет список только в том случае, если указанные критерии удовлетворяются, тогда у меня есть метод getPlayers(), который вызывает мой метод checkForAthleteWithInTwoSports() (проходит и видит, является ли этот игрок как в баскетболе, так и в футболе), чем возвращает отсортированный список с женщиной показывая первое (если применимо). Метод getPlayers() вызывается с моей главной страницы, а затем устанавливает его в класс адаптера. Лучший ответ xml сделает задачу, подобную этой МНОГО, проще, однако это не так, и я хочу найти более эффективный способ сделать это. Если бы кто-нибудь мог помочь мне найти хороший шаблон дизайна, чтобы решить эту проблему или какие-либо советы, которые я бы очень ей признал. (Кроме того, категории имеют больше атрибутов, чем просто «HomeRuns, points или touchdowns», просто пытающиеся упростить.)

ответ

1

Я не знаю, существует ли конкретный шаблон дизайна для решения вашей проблемы; с моей точки зрения, в вашей модели отсутствуют некоторые абстракции, поскольку в основном вы используете строки для представления вашей модели домена. Этот вид идет против ООП, где идея состоит в том, чтобы представлять вещи с объектами, чтобы вы могли делегировать им поведение. В качестве примера рассмотрим этот кусок кода:

if (localName.equalsIgnoreCase("football")) 
player.category = "football" 
player.TouchDowns=attributes.getValue("TouchDowns"); 

else if (localName.equalsIgnoreCase("baseball")) 
    player.HomeRuns=arrtibutes.getValue("HomeRun"); 
    player.category = "baseball" 

else{ 
    player.category = "basketball"; 
    player.Points=attributes.getValue("Points");} 

Это может быть легко улучшена путем создания трех классов для представления каждого спортивного результата (FootballPerformance, BaseballPerformance и BasketballPerformance), где каждый класс содержит атрибуты, которые к ним относятся.После того, как вы есть, что вы можете делегировать чтение узла XML к самому классу (пожалуйста, медведь со мной здесь, я не программист Java, поэтому я буду использовать псевдокод):

public class BasketballPerformance extends SportPerformance { 
    private Integer points; 

    //Constructor 
    public BasketballPerformance(Attributes attributes) 
    { 
    this.points = attributes.getValue("Points"); 
    } 

    public getPoints() 
    { 
    return this.points; 
    } 
} 

Классы FootballPerformance и BaseballPerformance очень похожи, беря набор атрибутов и заселяя себя на их основе. Применяя ту же самую идею в Player классе также можно децентрализовать создание объектов в нечто вроде:

public Sport createSportPerformanceInstance(String name, Attributes attributes) 
{ 
if (name.equalsIgnoreCase("football")) 
    {return new BasketballPerformance(attributes);} 
else 
if (name.equalsIgnoreCase("baseball")) 
    {return new BaseballPerformance(attributes);} 
... 
} 


public void load(String localName, String qName, Attributes attributes) 
{ 
SportPerformance sportPerformance = this.createSportPerformanceInstance(localName, attributes); 
Player player = new Player(Attributes attributes); 
player.sportPerformance = sportPerformance; 
} 

Обратите внимание, что, как хороший побочный эффект, если вы позже добавить новый вид спорта вам нужно только реализовать новый класса и добавьте новую ветку в метод createSportPerformanceInstance вместо погружения в один большой метод.

Код может быть впоследствии усовершенствован, если Player провести собрание представлений вместо одного и с PlayerHandler проверить наличие игрока перед созданием нового. Новый метод будет выглядеть примерно так:

public void load(String localName, String qName, Attributes attributes) 
{ 
SportPerformance sportPerformance = this.createSportPerformanceInstance(localName, attributes); 
String playerName=attributes.getValue("name"); 
Player player; 
    if (!this.playerExists(playerName)) 
    { 
    player = new Player(attributes); 
    } else 
    { 
     player = this.getPlayerByName(playerName); 
    } 
    player.addPerformance(sportPerformance); 
} 

приятно то, что теперь вы можете делегировать порядок сортировки игроков самого путем реализации интерфейса Comparable и модель также подходит лучше реальности того, что вы пытаетесь модель, так как у вас есть один игрок, который имеет разные представления в разных видах спорта.

Сказав это, вы можете найти вдохновение в Creational design patterns, особенно в Builder, Factory и Abstract Factory.

HTH

+0

Wow, love it. Иногда я в конечном итоге удаляюсь от подхода типа ООП = (спасибо большое за то, что играю в мои фиктивные данные и трачу время, чтобы помочь мне!) Извините, что я не могу проголосовать за вас в данный момент (недостаточно репутации) – user1823974

+0

@ user1823974: проблем нет! Рад помочь :) –

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