Шаблон проектирования для методов в другом классе - PullRequest
1 голос
/ 11 декабря 2008

Я ищу определенный шаблон дизайна.

Например, у меня есть класс статьи, clsArticle. Этот класс содержит переменные-члены, такие как Id, title, author, article и т. Д. Представьте, что я хочу показать все статьи в списке. Так что где-то мне нужно создать метод getAllArticles (). Поскольку clsArticle не несет ответственности за получение всех статей, я должен поместить этот метод в другой класс, clsArticleFact (где Fact означает «Фабрика»).

Кто-нибудь знает, как называется этот паттерн? Это способ работы шаблон дизайна?

Ответы [ 5 ]

3 голосов
/ 11 декабря 2008

Yeap. Правильно.

Это может быть либо AbstractFactory, либо DataAccessObject.

Первый - когда вы хотите, чтобы реализация возвращала различные виды статей

Например, допустим, у вас есть условие, когда статьи ведут себя по-разному в зависимости от платформы.

ArticleFactory.getAll(): Article[]

Вернет правильный список в каждой платформе.

Значение может быть:

WindowsArticleFactory

или

OSXArticleFactory

Первый может использоваться для абстрагирования места, из которого извлекаются статьи:

Возможно, у вас есть

ArticleDao.getAll(): Article[]

и реализации:

XmlArticleDao // Return a list of articles from an XML

или

DatabaseArticleDao // return the list from the database.

Суть в том, чтобы отделить создание (getAll ()) от использования (Статья)

Если ваше приложение достаточно простое, вместо него можно использовать factoryMethod.

 class Article { 
     static Article[] getAll() {
         // do whatever is neede here...
     }
 }

Надеюсь, это поможет.

1 голос
/ 11 декабря 2008

Вы также можете использовать подход, принятый классами моделей Rails ActiveRecord

public class clsArticle
{
  public static clsArticle[] findAll() { /*... */ }

  // the other regular code here;
}

// client code
foreach(clsArticle obArticle in clsArticle.findAll())
{
  list.add(clsArticle)
}
0 голосов
/ 11 декабря 2008

Не создавайте статические методы!

Ваша первая мысль должна быть интерфейс .

Может быть, вы могли бы написать что-то вроде (пример на Java)

public interface ArticleService {
    Article[]  getAllArticles() throws ServiceException();
}

Все остальные вещи, которые вам нужно сделать со статьями, также входят в этот интерфейс. Внедрить конкретную реализацию этого класса (DbArticleService, XmlArticleService, ...) в каждый объект, который должен иметь дело со статьями.

Таким образом, как упоминалось в других постерах, вы получаете разъединенный код и хорошее разделение интересов.

Но что бы вы ни делали, не делайте вещи статичными.

0 голосов
/ 11 декабря 2008

То, что вы описываете, на самом деле не шаблон, а принцип программирования, называемый Разделение проблем .

Из вашего описания я бы настоятельно утверждал, что вы после структурного шаблона проектирования, а не шаблона творческого проектирования, поскольку распределение проблем кодирования обсуждается из-за соучастия в творчестве.

Итак, мое лучшее предположение состоит в том, что выбранный вами шаблон, возможно, Фасадный шаблон или Шлюзы . Обычно используются Entities (ваш clsClass) со шлюзами.

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

public class clsClass
{
    public int ID;
    public string title;
    public string author;
    public string article;
}


public class BookGateway
{
    public List<clsClass> GetAllArticles()
    {
        var result = new List<clsClass>();

        // Add items here.
        // Can call database and populate each new clsClass
        // and add to result object.

        return result;
    }
}
0 голосов
/ 11 декабря 2008

Итак, создайте статический класс для этой цели:

public static class clsArticles
{
    public static clsArticles[] GetAllArticles() { /* actual code */ }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...