общие вопросы программирования - PullRequest
2 голосов
/ 15 марта 2011

подумайте о трех задачах А, В и С.

A использует x, y методы для решения;

B использует x, z и

C использует x, y, z.

какой из них будет лучше, а какой - лучше, а какой - более читабельным

  1. «написание трех разных методов»

  2. "написание одного метода и взятие одного или два параметра и решить, какие часть будет работать, если оператор "

И, пожалуйста, объясните, почему.

Ответы [ 4 ]

4 голосов
/ 15 марта 2011

Здесь необходимо найти компромисс между производительностью и модульностью.

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

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

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

Я бы разбил функцию, которую вы реализуете с помощью x, y, z, и сделал бы как можно больше методов. Это следует простому простому правилу: Каждый метод выполняет одну работу, не более и не менее . Затем вы можете составить эти методы, чтобы получить все необходимые функции для A, B, C.

2 голосов
/ 15 марта 2011

Лучше всячески писать отдельные методы.

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

В отличие от этого, используя методы, достаточно оптимизирующий компилятор (яне знакомый с компилятором F # и умеет ли он это делать) может развернуть текст метода, сэкономив на создании новых фреймов стека.Даже если ваш компилятор не настолько оптимизирует, создание нового стекового фрейма является относительно дешевым.

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

2 голосов
/ 15 марта 2011

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

1 голос
/ 15 марта 2011

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

Учтите, что по мере развития базы кода мне может потребоваться выполнить некоторый рефакторинг, который потребует от меня определения использования z.В случае «трех методов» это тривиально, так как я просто ищу все z сайты вызовов - то, что подойдут для меня самые современные IDE и инструменты перекрестных ссылок.В случае «одного метода» анализ является более сложным.Мне нужно не только идентифицировать все сайты вызовов, но и затем выполнить анализ потока, чтобы определить значения параметров, которые запускают различные варианты поведения.Если эти параметры являются постоянными, это не может быть слишком обременительным.Но если они вычисляются, то это может быть много работы, особенно если они вычисляются где-то вверх по цепочке вызовов.

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

...