Как называется этот принцип дизайна? - PullRequest
1 голос
/ 03 августа 2011

Я ищу название принципа дизайна, который по сути гласит: «Клиентский код никогда не должен помнить ничего особенного о способе использования интерфейса».

Например, допустим, у вас было два метода: loginAttempted (), который проверяет опубликованные данные u / p, и loginValid (), который проверяет подлинность u / p.Теперь предположим, что вы всегда должны вызывать loginAttempted () перед вызовом loginValid () - если вы вызываете loginValid () и не было опубликовано u / p, вы будете пытаться получить доступ к неопределенным переменным и получить ошибку.Таким образом, этот пример нарушает рассматриваемый принцип, поскольку клиентский код должен помнить о необходимости использовать loginAttempted () перед вызовом loginValid ().

Итак, как называется этот принцип дизайна?

Ответы [ 3 ]

4 голосов
/ 03 августа 2011

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

1 голос
/ 07 января 2012

Конкретный пример

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

Пятно включено.Но я думаю abstract.Специфика ваших общих потребностей может привести к этому в любом случае.Но мы должны также добавить еще один комментарий в микс:

Более высокий уровень абстракции может "исправить" это.

Большая картинка

  • Открытый метод Login () (для клиентского кода), который ...
  • Вызывает LoginAttempted () и LoginValid () по порядку.
  • Далее, эти 2 под-метода: abstract (могут быть делегатами)
  • Таким образом, код клиента может вызывать только Login () и ...
  • Вход в системуреализации могут настраивать как эти функции входа в систему и ...
  • их порядок вызовов постоянен.

BTW, имея заменяемые методы в упорядоченном списке методовзвонки это шаблон дизайна шаблона .

Этот пример на C # (надеюсь, он работает!)

public abstract class LogOnBase {

    // add comments here so we know what these are supposed to do
    protected abstract void LogInValid(string, string);
    protected abstract void LogInAttempted (string, string);

    public bool Logon(string userName, string Password) {
        LogInAttempted (userName, Password);
        LogInValid (userName, Password);
    }
}

// concrete implementation
public class LogOnConcrete : LogOnBase {
    protected override void LoginValid (string UName, string PW) {
        // do concrete stuff
    }

    protected override void LogInAttempted (string UName, string PW) {
        // do concrete stuff
    }
}

// Using the LogOn class
public class LogOnExample {
    string whoAmI;
    string passWord;
    LogOnConcrete LogMeIn;

    public LogOnExample (string me, string pw) {
        whoAmI = me;
        passWord = pw;
    }

    public static void Main (string[] args) {
        LogOnExample driver = new LogOnExample (bubba, mySecretPW);
        LogMeIn = new LogOnConcrete();
        LogMeIn.Logon(driver.whoAmI, driver.passWord);
    }
}
1 голос
/ 03 августа 2011

Я могу только описать это как недостаток скрытия информации .

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

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

...