дизайн кода для непрерывной интеграции - PullRequest
3 голосов
/ 28 апреля 2011

Каковы лучшие практики для разработки кода при работе с парадигмой непрерывной интеграции малых и часто коммитов?Например, учитывая большую особенность, как разбить его на более мелкие части?Как разработать улучшенную функциональность, пока старая еще жива.И т. Д.

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

Доменными языками, которые меня интересуют, являются Java / C # ипохоже.

ОБНОВЛЕНИЕ: Обратите внимание, я не спрашиваю о том, как включить CI в целом.Такие ответы препятствуют необходимости настройки сервера сборки, проведения автоматических тестов и т. Д. Вопрос заключается в том, как спроектировать код так, чтобы частые, небольшие коммиты работали.Например, все тесты пройдены.Значение как при представлении новой функции, так и при изменении функции.

Ответы [ 2 ]

2 голосов
/ 29 апреля 2011

Сначала вы должны попытаться придерживаться принципа Открытое / Закрытое

Из википедии:

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

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

Для изменений кода, которые требуют модификации базовой схемы данных, вы можете настроить вид «непрерывного преобразования», который может преобразовывать данные на лету между двумя реализациями во время выполнения. Рэнди Шоуп из ebay гораздо лучше объясняет это, чем я в его Evolvable Systems выступлении на InfoQ.

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

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

1 голос
/ 28 апреля 2011

Это будет открыто для многих дебатов, но непрерывная интеграция и TDD идут рука об руку. Вам нужно больше, чем просто "он компилируется?" уровень тестов для обеспечения надежности постоянно меняющегося кода.

Если вы соблюдаете высокую степень охвата тестирования, то любая функция, которую вы нажимаете, будет полностью протестирована в рамках сборки, прежде чем она будет принята. Это означает, что вы должны кодировать таким образом, чтобы вы могли быстро получить целые фрагменты функциональности, а затем наращивать их, а не наращивать. (вертикальная нарезка).

Что это значит с точки зрения кода?

Вам необходимо сильно полагаться на Принцип обращения зависимостей

Вместо этого:

public class PersonService
{
    private SqlDataAccess DataAccess = new SqlDataAccess();

    public void SavePerson(Person person)
    {
        DataAccess.SavePerson(person);
    }
}

Вы должны сделать это:

public class PersonService
{
    private IDataAccess DataAccess {get; set;}

    public PersonService(IDataAccess dataAccess)
    {
        if(dataAccess == null)
            throw new ArgumentNullException("dataAccess");

        DataAccess = dataAccess;
    }

    public void SavePerson(Person person)
    {
        DataAccess.SavePerson(person);
    }
}

Это простой пример, но он предлагает вам возможность принять решение, например, реализовать уровень доступа к данным в памяти, одновременно расширяя пользовательский интерфейс и основные функции. Тесты все еще могут быть написаны, потому что вы можете издеваться над сервисом, и вы можете продвигать функциональность быстрее, так как не каждая часть должна быть на 100%. Когда требования начинают укрепляться, вы можете принять более обоснованное решение о доступе к данным и просто заменить временный компонент более постоянным, не беспокоясь о нарушении существующего кода.

И, конечно, у вас будет автоматические интеграционные тесты, запущенные, чтобы гарантировать, что вы не нарушите остальную часть своей базы кода;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...