Ну, я вважаю, що це зводиться до різниці між добром і досить добрим .
Хоча в більшості випадків ви можете уникнути використання констант, реалізуючи інші шаблони (стратегію чи, можливо, легку вагу), можна сказати, що для представлення концепції не потрібно півдесятка інших класів. Я думаю, що це зводиться до того, наскільки вірогідною є потреба в інших константах. Іншими словами, чи є необхідність розширити ENUM, наданий константами в інтерфейсі. Якщо ви можете передбачити необхідність її розширення, тоді перейдіть з більш формальною схемою. Якщо ні, то це може бути достатньо (це буде досить добре, а значить, і менше коду для написання та тестування). Ось приклад досить хорошого та поганого використання:
Погано:
interface User {
const TYPE_ADMINISTRATOR = 1;
const TYPE_USER = 2;
const TYPE_GUEST = 3;
}
Досить добре:
interface HTTPRequest_1_1 {
const TYPE_CONNECT = 'connect';
const TYPE_DELETE = 'delete';
const TYPE_GET = 'get';
const TYPE_HEAD = 'head';
const TYPE_OPTIONS = 'options';
const TYPE_POST = 'post';
const TYPE_PUT = 'put';
public function getType();
}
Тепер причина, по якій я обрала ці приклади, проста. User
Інтерфейс є визначальним перерахування типів користувачів. Це з великою ймовірністю розшириться з часом і краще підходить за іншою схемою. Але HTTPRequest_1_1
це пристойний випадок використання, оскільки перерахунок визначений RFC2616 і не зміниться впродовж життя класу.
Взагалі, я не бачу проблему з константами та константами класу як глобальною проблемою. Я бачу це як проблему залежності. Це вузьке розрізнення, але певне. Я бачу глобальні проблеми як у глобальних змінних, які не застосовуються, і як такі створюють м'яку глобальну залежність. Але жорстко закодований клас створює примусову залежність і як такий створює жорстку глобальну залежність. Тож обидва - це залежності. Але я вважаю глобальне набагато гіршим, оскільки воно не застосовується ... Ось чому я не люблю обробляти класові залежності з глобальними залежностями під одним банером ...
Якщо ви пишете MyClass::FOO
, ви чітко зашифровані до деталей реалізації MyClass
. Це створює жорстке з'єднання, що робить ваш код менш гнучким, і тому його слід уникати. Однак існують інтерфейси, які дозволяють саме такий тип зв'язку. Тому MyInterface::FOO
не вводять жодної конкретної муфти. З урахуванням сказаного, я б не вводив інтерфейс просто для того, щоб додати константу до нього.
Так що, якщо ви використовуєте інтерфейс, і ви дуже впевнені , що ви (або хтось -або ще в цьому відношенні) не потрібні додаткові значення, то я не бачу великої проблеми з константами інтерфейсу ... Кращий конструкції не включатимуть ні константи, ні умовні умови, ні магічні числа, ні магічні струни, ані жорстко закодовані. Однак це додає додаткового часу на розробку, оскільки ви повинні враховувати використання. На мою думку, в більшості випадків варто витратити додатковий час, щоб створити чудовий дизайн. Але бувають випадки, коли досить добре дійсно є прийнятним (і досвідчений розробник потребує розуміння різниці), і в цих випадках це добре.
Знову ж таки, це лише мій погляд на це ...