Булевий метод іменування стверджувального проти негативного


43

Чи повинні булеві методи завжди приймати стверджувальну форму, навіть коли вони лише коли-небудь будуть використовуватися в негативній формі?

Скажімо, я хотів перевірити, чи існує сутність, перш ніж створити її, мій аргумент полягає в тому, що перша форма нижче є кращою за другу форму, незалежно від того, застосовується чи ні метод у позитивній формі.

Підсумовуючи, мені здається, if(!affirmative)що читати легше, ніж if(negative). У мене є колега, який не згоден, думає?

Перша форма:

int entity_id = 42;
if(!entity_exists(entity_id)) create_entity(entity_id);

Друга форма:

int entity_id = 42;
if(entity_not_exist(entity_id)) create_entity(entity_id);

3
C ++? як щодоif (not entity_exists(entity_id))
Кос


to-may-to-mah-to. Чесно кажучи, я !стільки разів пропускав персонаж, що змушує мене неправильно зрозуміти код, поки я його знову не прочитав. Тому я, мабуть, більше згоден з вашим колегою. Мені подобається форма, яка оцінює справжню, коли ви її вивчаєте.
Берін Лорич

Просто хотілося прислухатись, щоб сказати, що це if (!exists) create()може сприйматись як погана практика у багатьох мовах / рамках, оскільки це, як правило, не є безпечним для потоків. Зазвичай кращим підходом є виклик create()та обробка конкретних винятків або повернення кодів, які говорять про те, що сутність вже існує. Це, звичайно, не є відповіддю на власне питання (тому це лише коментар).
julealgon

Відповіді:


61

Чи повинні булеві методи завжди приймати стверджувальну форму, навіть коли вони лише коли-небудь будуть використовуватися в негативній формі?

Створення правил щодо таких речей здається небагато - я не хотів би бачити керівництво в документі зі стандартами кодування, в якому сказано, що ви не будете використовувати негативні імена для булевих властивостей . Але, що стосується особистого стилю, я думаю, що намагатися зберегти імена позитивними може бути прекрасним ідеалом. Однак я вважаю, що також добре уникати потреби у цій худій і легко пропущеній !. Часто можна знайти способи перетворити негативне ім'я в позитивне:

  • accountHasCharges
  • accountIsClear(те саме !accountHasCharges)

Чіткість - це найважливіший розгляд, і вагомою причиною уникнення імен негативних методів є те, що вони можуть призвести до подвійних негативів або ще гірше:

  • isComplete // добре
  • isNotComplete //! isComplete, як правило, краще
  • isIncomplete // може мати сенс, якщо "неповне" є відомим станом об'єкта
  • !isNotComplete // жахливий
  • !isNotComplete == 0 // може призвести до постійної відпустки

5
"Я не хотів би бачити керівництво в документі про стандарти кодування, в якому сказано, що ви не будете використовувати негативні імена для булевих властивостей ." - Я просто залишу це тут ...
AakashM

16
Ви забули!isNotIncomplete
Бен Лі

Так би протилежністю entity_existsбути entity_should_be_createdentity_not_exists)? А може entity_missing, згідно з пропозицією Дана?
ADTC

1
Тут документ зі стандартів кодування може використовувати слово "вважати за краще", а не "повинен" або "повинен".
Уейн Конрад

15

Я згоден, що стверджувальне легше читати. Ви можете спробувати

Третя форма

int entity_id = 42;
if (entity_is_missing(entity_id)) create_entity(entity_id);

або

Четверта форма

int entity_id = 42;
if (is_entity_missing(entity_id)) create_entity(entity_id);

2

Це також залежить від того, як буде використовуватися ваш метод. Якщо він буде використовуватися як у позитивних, так і в негативних випадках, наприклад

if (!entity_exists(entity_id)) create_entity(entity_id);

if (entity_exists(entity_id)) publish_entity(entity_id);

Тоді назва методу має бути позитивною, як і вище. Якщо ви не впевнені, як це буде використовуватися, тоді дотримуйтесь вищесказаного.

Але якщо він використовується ТІЛЬКИ у негативному випадку, то прийнятне наступне (можливо, навіть бажане)

if (entity_not_exists(entity_id)) create_entity(entity_id);

а ще краще переформулюйте це, щоб воно було більш позитивним

if (entity_is_absent(entity_id)) create_entity(entity_id);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.