2015-07-10 18 views
0

Лучшие практики постоянно определяют, что метод должен отвечать только за одну вещь. Я столкнулся с методом, который делает 3 вещи, и я не знаю, как 1. разложить его в соответствии с лучшими практиками. 2. Назовите его. Также интересно, сколько методов в реальной жизни действительно делает только одна вещь, поскольку текстовые книги советуют все время?Как такой простой метод можно разбить и назвать?

method (entryId) { 
    if (this.checkDuplicate(entryId)) { 
     this.deleteDuplicate(entryId); 
     return true; 
    } else { 
     return false; 
    } 
} 

Как мы видим, этот метод называется методом, делает больше, чем просто одно. Возможно ли даже соблюдение «метода должно отвечать только за одно правило»?

Если да, то как этот алгоритм может быть разложен?

Если нет, что я могу назвать методом, который делает так много всего?

+0

Вы, возможно, ищите вглубь этого, вы в основном говорите, если утверждения никогда не должны использоваться. То, о чем вы должны спрашивать себя, есть ли имя функции 'method' только для одного? Вам не нужен метод, который делает UpdateDataBase и отправляет электронную почту, например. – dbarnes

+1

Технически этот метод не должен существовать, поскольку 'deleteDuplicate (entryId)' должен проверять, есть ли что-то, что нужно удалить! Если вы сохраните этот метод таким образом, 'checkDuplicate (entryId)' вызывается дважды: методом и deleteDuplicate – engineercoding

ответ

0

Скажем так: это правило (GRASP - High Cohesion pattern) не касается семантического или синтаксического языка программирования. Вместо этого это означает, что вы должны быть осторожны с вашими обязанностями методов/классов больше, чем функциональная или бизнес-логическая точка зрения. Практически все принципы дизайна должны применяться очень осторожно и продуманно, или вы получите десятки и десятки непрямых и абстрактных слоев без реальной цели.

0

Хотя то, что написал Yauheni Maltsau, верно, я хотел бы добавить 10 центов.

Я бы сказал, что ваш метод на самом деле делает только 1 вещь: проверьте дубликат и удалите его. Поэтому я буду хранить это так, кроме имени. Вы должны дать ему более описательное имя, например, removeIfDuplicate или что-то в этом роде.

0

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

Я бы, наверное, начал с наименования метода «deleteEntryIfDuplicate», и я задал себе вопрос, почему метод должен возвращать логическое значение. Поскольку у меня нет кода вызова, который использует логическое значение, я могу только предполагать, но может быть ответственность, которая не обрабатывается в нужном месте. Возможно, вместо того, чтобы возвращать логическое значение, все функции для случая дублированной записи должны обрабатываться одним методом, который делает удаление, регистрирует его и уведомляет слушателей, например. Это может показаться добавлением обязанностей, но управление случаем дублирования записи может рассматриваться как 1 ответственность. Выпечка торта - это единственная ответственность, даже если это означает, что вам нужно взять яйца и молоко из холодильника, вынуть муку и сахар из кладовой, предварительно разогревать духовку и т. Д. Цель состоит в том, чтобы каждый звонок на правильный уровень абстракции.

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