Изменить поведение объекта ... но только несколько строк? - PullRequest
0 голосов
/ 03 августа 2010

Привет, уроды и гики.И снова мой вопрос, спасибо за помощь!

Предположим, у меня есть объект Foo, метод foo () делает около 100 строк.

foo () {... qwert yuiopasdfg zxcvb nmhjk ...}

Если разработчик хочет добавить некоторый код в foo (), это можно легко сделать с помощью наследования, компоновки или шаблона Decorator.

Но в этом случаеон хочет изменить «одну строку» в середине кода (изменить значение свойства, вызвать метод перед чем-то ...), какой лучший способ это сделать?

foo2 () {... qwert yuiop ASDFG zxcvb nmhjk ...}

Цель состоит в том, чтобы позволить первоначальному разработчику определить поведение, не беспокоясь о том, что другие будут изменять / изменять.

Новый разработчик должен иметь возможностьизменять объект / метод / свойство без повторного ввода кода.

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

А как насчет среды фиксации, где изменения, внесенные в объект, требуют применения фиксации?foo () работает нормально, затем foo2 просто меняет нужные свойства и делает коммит.

Любые другие альтернативы?

Спасибо!

Ответы [ 5 ]

1 голос
/ 03 августа 2010

Разбейте функцию на более мелкие шаги.Скорее всего, функция из 100 строк делает больше, чем одно (и если этого не произойдет, нет необходимости менять строку наполовину).

0 голосов
/ 03 августа 2010

Но в случае, если он хочет изменить «одну строку» в середине кода (изменение свойства, вызов новой функции перед чем-то ...), декоратор это не вариант.

Какой, по вашему мнению, правильный подход для достижения этой цели (изменить 2 строки по 100 без повторного ввода всех)

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

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

Должен ли я создать () с 100 слушателями / обратными вызовами?Должен ли я определить некоторые "известные шаги" и использовать что-то вроде "insertCodeBefore / After (step)"?

Это, вероятно, также будет очень грязным и неэффективным решением.

0 голосов
/ 03 августа 2010

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

0 голосов
/ 03 августа 2010

Инкапсулируйте шаги, которые изменяют поведение объекта.В C ++ land часто используется основанный на политике дизайн , если вам не нужно выбирать поведение во время выполнения.Поток управления определен в классе, и то, что фактически делается в некоторых точках, зависит от параметров шаблона.

Важная и самая сложная часть состоит в том, чтобы соответствующим образом разделить ваши методы и часто зависит от требуемой настраиваемости,Помните о ЯГНИ, когда делаете что-то подобное.

0 голосов
/ 03 августа 2010

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

Python-ish:

def a(foo=None):
    qert
    yuiop
    if foo is None:
        asdf
    else:
        foo()
    zxcvb
    nmhjk

a(foo=lambda: ASDF)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...