Проще говоря, потому что добавление объекта Type3Request
в ваш код заставляет вас редактировать существующий код. Каждый раз, когда вы меняете существующий код, вы должны протестировать все связанные модули в своем приложении, чтобы убедиться, что в коде отсутствуют ошибки регрессии. В javascript или других свободно типизированных языках очень легко переписать глобальные данные из ветви if. На большинстве строго типизированных языков вы можете вообще избежать этой проблемы, но есть все еще возможность перезаписи локальных данных. Это означает, что каждый раз, когда вы меняете этот метод executeRequests
, вы должны запускать все возможные запросы в своем приложении, чтобы убедиться, что вы не представили новую проблему. Я хочу пояснить, что я сказал все запросы, а не все типы запросов. Это потенциально тысячи тестов для запуска, даже если у вас есть только несколько типов запросов.
С другой стороны, сохранение этого кода внутри разных классов в качестве полиморфного метода гарантирует, что он не может изменять данные из метода executeRequests, а также класса его владельца. Это позволяет вам проверять только вызовы, относящиеся к типу, который вы меняете, с тем же доверительным уровнем. Другими словами, это уменьшает количество ошибок в вашем коде.
Используя полиморфизм, весь «конкретный код», который должен быть выполнен для этого запроса, будет не только инкапсулирован в объект Type3Request
, но и на самом деле придет с этим объектом. Для добавления нового типа запроса нет другого файла кода.
Это означает, что вы можете предоставлять новые типы запросов динамически в виде плагинов, просто добавляя DLL в папку и не перекомпилируя существующий код. Если вы не хотите идти так далеко, он по-прежнему дает вам возможность лучше разделить рабочую нагрузку между всеми членами команды, избегая слияний с этим методом executeRequests
.
Он также упрощает проверку кода, поддерживая плотно связанную бизнес-логику. Вместо того, чтобы получить ваш запрос, чтобы пройти весь процесс выполнения только для проверки этого типа конкретного кода, вы можете просто вызвать метод непосредственно из объекта запроса и утвердить результаты.
Все это гарантирует, что при изменении архитектуры в вашем проекте вы знаете, что есть только одно место для поиска кода, связанного с запросом: связанный с ним тип типа запроса. Если вы пропустите этот код в других классах, вы можете пропустить некоторые экземпляры этого кода при оценке сложности изменений или, что еще хуже, оставьте его после большого рефакторинга, который может вызвать ошибки.
Если вы хотите получить подробное объяснение этих концепций, я настоятельно рекомендую вам прочитать [Clean Code by Robert C. Martin] (http://www.amazon.ca/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882). Вы также можете взглянуть на [этот пост в блоге] (http://blog.8thlight.com/uncle-bob/2014/05/08/SingleReponsibilityPrinciple.html) от того же автора. –