Ответы пользователя по тегу ООП
  • Правильно я понял паттерн Command?

    SergeyEgorov
    @SergeyEgorov
    Веб разработчик
    Решил что-ли все шаблоны разом выучить? Суть шаблона команда в том, что внутри может быть инкапсулировано любое поведение, а выполнено оно может быть унифицировано, каким угодно пользователем:

    public interface Command
    {
      void execute();
    }
    
    public class FindUserCommand : Command
    {
      public void execute()
      {
        /// Здесь у нас код, который ищет пользователя
      }
    }
    
    public class DeleteUserCommand : Command
    {
      public void execute()
      {
        /// А здес у нас код, который удаляет пользователя
      }
    }
    
    FindUserCommand findUser = new FindUserCommand();
    DeleteUserCommand deleteUser = new DeleteUserCommand();
    
    /// Поскольку оба этих класса реализуют абстракцию Command
    /// мы можем поместить их экземпляры например в коллекцию
     
    HashSet<Command> commands = new HashSet<Command>();
    commands.Add(findUser);
    commands.Add(deleteUser);
    
    /// И отдать затем эту коллекцию кому-нибудь, кто вообще 
    /// ничего не знает про FindUserCommand и DeleteUserCommand
    /// а знает только про Command. И не смотря на это, этот кто-то
    /// совершенно спокойно может выполнить инкапсулированное 
    /// внутри команд поведение.
    
    foreach(Command command in commands)
    {
      command.execute();
    }
    Ответ написан
    Комментировать
  • Правильно ли реализован паттерн Observer?

    SergeyEgorov
    @SergeyEgorov
    Веб разработчик
    Одну строчку осталось добавить...

    virtual void Notify() {
      for (int i = 0; i < followers.size(); ++i) {
        followers[i].Update();            
      }
    }
    Ответ написан
  • Почему используют interface a не abstract class?

    SergeyEgorov
    @SergeyEgorov
    Веб разработчик
    Абстрактный класс может реализовать некое базовое поведение, которое затем унаследуют потомки, а интерфейс это в чистом виде контракт, никакого поведения, только сигнатуры.

    Если никакого базового поведения, которое могли бы использовать потомки нет, то нет смысла и использовать абстрактный класс.
    Ответ написан
    Комментировать
  • Что предпочтительнее: наследование или обёртка?

    SergeyEgorov
    @SergeyEgorov
    Веб разработчик
    Парсер в данном случае просто интерфейс. Поскольку Python - язык с динамической типизацией, то наследование или обертки не требуются вовсе. Просто все конкретные парсеры должны реализовать подразумеваемый интерфейс:
    class CsvParser:
        def parse(self, file_name):
    
    class XlsParser:
        def parse(self, file_name);


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

    { 'csv': CsvParser(), 'xls': XlsParser(), 'xml': XmlParser() }


    В конечном итоге можно реализовать поставщик парсеров, который будет выбирать подходящий парсер из вышеозначенного словаря, используя расширение имени файла:

    class ParserProvider:
            def provide(file_name):
    Ответ написан
    Комментировать