Связь между публичными функциями - PullRequest
4 голосов
/ 07 октября 2011

Допустим, у меня есть функция do3 (). Чтобы эта функция работала, мне нужно, чтобы выполнялись функции do1 () и do2 ().

Однако do1 () и do2 () могуттакже может понадобиться для других вещей (возможно, для do4 ())

Все эти функции общедоступны (и должны быть публичными).

Вопрос, как мне реализовать код?

Вариант 1:

function do3() {
    do2()
    do whatever is needed for do3
}

function do2() {
    do1()
    do whatever is needed for do2
}

function do1() {
    do whatever is needed for do1
}

Так что, если я вызову do3 (), я уверен, что все будет сделано, хотя появится связь

Вариант 2

function do3() {
    do whatever is needed for do3
}

function do2() {
    do whatever is needed for do2
}

function do2() {
    do whatever is needed for do1
}

Поэтому, когда я хочу вызвать do3 (), мне нужно

do1()
do2()
do3()

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

С опцией 2, однако я должен быть уверен, что буду вызывать do1 и do2 каждый раз, когда я хочу использовать do3.

Если у кого-то есть идея получше (вариант 3?), Было бы здорово.

Спасибо

Ответы [ 3 ]

1 голос
/ 07 октября 2011

Соединение - это концепция, связанная с классами, а не функциями.Функция должна иметь возможность вызывать любые другие функции того же класса, в котором она живет. Там нет проблем с соединением.

Ваш первый вариант в порядке, нет ничего плохого в том, что do3 вызывает do2, а do2 вызывает do1 какПока они все в одном классе.

Вы не должны использовать свой вариант 2, так как для этого потребуется повторять код везде.

0 голосов
/ 07 октября 2011

Короткий ответ таков: если do3 () всегда должен выполнить вызов do2 / do1, и нет контекстов, когда вызывающему абоненту может потребоваться выполнить какое-то действие между этими вызовами, тогда do2 действительно должен быть включен в do3 и т. Д.,Я также утверждаю, что если вызовы doX не являются частью API или другой сложной для изменения среды, было бы разумно избегать разделения вызовов «на всякий случай», в будущем возникнет ситуация, требующая их разделения (принцип осторожного проектирования).).

Более длинный ответ: Один из способов проверить истинность чего-либо - это изучить патологические случаи.Принятие вашего второго варианта до крайности в основном повлечет за собой полное раскрытие функциональной композиции до точки полного устранения функций;в конце концов, некоторая функция вызывает do1 () do2 () do3 () и, таким образом, «связана» с этими функциями.

[мыльница] Это просто неверное предположение, что статические зависимости (связывание) обязательно являются пороком, хотя это понятие популярно сейчас.Статические зависимости могут показаться негибкими, но они также просты для понимания, проверяемы машиной и высоко оптимизируемы.Чтобы проиллюстрировать это, рассмотрим следующий гипотетический код:

person = WebRequest('/GetPerson');
if (person.Phone.AreaCode = '')
    person.Phone.AreaCode = GetAreaCodeFromZip(person.Zip);
...

Такая логика может быть и часто разлагается по множеству причин на, возможно:

requestService = CreationFactory(IRequest);
requestService.Configure(ConfigurationService.GetConfiguration(requestService));
requestService.SetEntityContext('Person');
response = requestService.Invoke();
entity = EntityService.ProcessEntity(response.Data);
EntityService.RegisterEntityCorrectionService(entity, IAreaCorrectionService);
...
interface IAreaCorrectionService
...
class AreaCorrectionService : IAreaCorrectionService
...
ServiceFactory.Register(AreaCorrectionService...

Моя точка зрения просточто есть затраты с точки зрения производительности, читаемости и даже снижения декларативности до «развязки».Это редко учитывается явно, когда рассматривается инверсия управления и другие рамки.

0 голосов
/ 07 октября 2011

«Допустим, у меня есть функция с именем do3 () для этой функции для работы мне нужно, чтобы выполнялись функции do1 () и do2 (). «

Хуан: согласно вашему описанию do3 () зависит от do1 () и do2 (). График зависимости

    - ->do2()
do3()
    - ->do1() 

В этом случае вы должны пойти на второй подход.

Если ваш график зависимостей:

do3()- ->do2() - -> do1()

т.е.

  • do3 зависит от do2

  • do2 зависит от do1

В этом случае вы должны пойти на первый подход.

--> : shows the dependency.
...