Нарушение принципа единой ответственности, если метод делает больше, чем одну вещь? - PullRequest
4 голосов
/ 10 марта 2010

Для моих целей мне нужно найти определенный узел в XML-файле и, если он найден, удалить его. Должен ли я использовать функциональность поиска в своем собственном методе и удалить функциональность в своем собственном методе? Это кажется более дорогим, потому что я буду один раз искать xml-файл, чтобы увидеть, существует ли он, и искать его снова, чтобы удалить. Если я объединю эти две функции в один метод, я могу удалить его, когда найду. Я правильно понимаю SRP здесь?

Ответы [ 4 ]

1 голос
/ 10 марта 2010

Есть ли у вас другие причины / ситуации, в которых вы ищете файл XML? В целом, хорошо разделять отдельные работы на любом уровне, независимо от того, соблюдаете ли вы чьи-то правила или нарушаете их (это мое правило ;-)). Разделение этих функций может (?) Также сделать ваш код более понятным, что может оказаться более важным, чем тривиальное повышение производительности.

1 голос
/ 24 мая 2014

Нет, принцип единой ответственности не касается деталей написания кода. Речь идет о том, как разделить функциональность программы на классы. В нем говорится, что если класс может измениться по нескольким причинам, это должно быть два класса. Классическим примером является класс, который создает и форматирует отчет; содержимое отчета и формат отчета могут меняться в разное время, поэтому класс является хорошим кандидатом для рефакторинга на две части.

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

(С другой стороны, если у вашего класса много логики в домене, а также много гайков и манипуляций с XML, это нарушит SRP.)

1 голос
/ 10 марта 2010

Ваш средний XML-парсер будет создавать узлы, которые знают своих родителей, поэтому вы можете сделать что-то вроде:

XmlNode node = this.FindNode(filter);
node.ParentNode.DeleteChild(node);

Таким образом, вы разделили обе функции, но без накладных расходов.

Относительно ядравашего вопроса: Да, поиск и удаление в одном методе нарушают единственную ответственность, но во многих случаях производительность и SRP не так хорошо сочетаются, поэтому вам нужно решить, что важнее.

PS:
Примерне имеет (сознательно) никакого отношения к какому-либо реальному языку там.

0 голосов
/ 24 мая 2014

Это нарушает Принцип разделения командных запросов , который, я чувствую, идет рука об руку с SRP.Поиск и удаление - это две вещи, которые можно изменить, поэтому их также можно определить как две отдельные обязанности.Они могут быть проверены модульно отдельно, у вас может быть ошибка в том, как вы находите узел, но не в удалении.Вы также можете макетировать часть удаления.Это также дает вам промежуточную точку между поиском и удалением (опять же это возвращает к юнит-тестированию и отладке).

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

Не преждевременно оптимизируйте свой код! Напишите его наиболее приемлемым способом / наилучшим образом, как вы можете, тогда ЕСЛИ это бутылочная горловина, вы можете настроить его.

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