Мое предпочтение заключается в том, чтобы установить их непосредственно в конструкторе по нескольким причинам. Во-первых, что-то вроде this.x = x;
так же ясно, если не больше, чем вызов отдельного метода, который делает то же самое. Во-вторых, метод может быть потенциально переопределен, если он не будет помечен как окончательный, а вызов потенциально переопределенных методов из конструктора - это большое значение no-no в моей книге. В-третьих, большинство методов обычно предполагают, что объект уже завершен, когда они выполняются, а не на полпути к его построению. Хотя это не должно вызывать каких-либо проблем в этом простом случае, в более сложных случаях это может вызвать серьезные тонкие ошибки, требующие возраста для отслеживания.
Основной аргумент в пользу использования сеттеров / геттеров во всем мире состоит в том, что это означает вы можете переименовать поле, просто изменив его имя в 3-х местах, его определение, методы getter / setter, и все должно компилироваться и быть в порядке. На мой взгляд, этот аргумент недействителен в наши дни, поскольку любая достойная современная среда IDE переименует все вхождения такого поля с помощью простого сочетания клавиш.
От лучшего к худшему:
Вариант 1 (C99)
#include <stdbool.h>
Вариант 2
typedef enum { false, true } bool;
Вариант 3
typedef int bool;
enum { false, true };
Вариант 4
typedef int bool;
#define true 1
#define false 0
Если вы не определились, выберите # 1!
Если Ваше использование c99 Вы может использовать тип _Book, который является частью c99, Т.е. никакие #includes' не необходимы. Действительно необходимо рассматривать его как интервал хотя, где 1 = верный и 0 = ложь. Можно затем определить ИСТИНУ И ЛОЖЬ.
_Bool this_is_a_Boolean_var = 1;
//or using it with true and false
#define TRUE 1
#define FALSE 0
_Book var = TRUE;
Для этого можно использовать символ или другой контейнер с маленькими числами.
Псевдокод
#define TRUE 1
#define FALSE 0
char bValue = TRUE;
Все, что ненулевое, оценивается как истина в логических операциях, поэтому вы можете просто
#define TRUE 1
#define FALSE 0
и используйте константы.
Логическое значение в C является целым числом: ноль для false и ненулевое значение для true.
См. Также Логический тип данных , раздел C, C ++ , Objective-C, AWK .
C имеет логический тип: bool (по крайней мере, для последних 10 ( !) лет)
Включите stdbool.h, и значение true / false будет работать должным образом.
Если вы используете Компилятор C99 имеет встроенную поддержку типов bool:
#include <stdbool.h>
int main()
{
bool b = false;
b = true;
}
Несколько мыслей о логических значениях в C:
Я достаточно взрослый, чтобы использовать простые int
в качестве логического типа без каких-либо определений типов, специальных определений или перечисления для истинных / ложных значений. Если вы последуете моему предложению, приведенному ниже, о том, чтобы никогда не сравнивать с логическими константами, вам все равно нужно использовать 0/1 для инициализации флагов. Однако в наше время такой подход может показаться слишком реакционным. В этом случае обязательно следует использовать
, поскольку он, по крайней мере, имеет преимущество стандартизации.
Какие бы булевы константы ни вызывались, используйте их только для инициализации. Никогда не пишите что-то вроде
if (ready == TRUE) ...
while (empty == FALSE) ...
. Их всегда можно заменить на более четкие
if (ready) ...
while (!empty) ...
. Обратите внимание, что их можно разумно и понятно прочитать вслух.
Дайте вашим логическим переменным положительные имена, например full
вместо notfull
. Последнее приводит к тому, что код трудно читается. Сравните
if (full) ...
if (!full) ...
с
if (!notfull) ...
if (notfull) ...
Обе предыдущие пары читаются естественно, тогда как ! Notfull
неудобно читать даже в том виде, в каком он есть, и становится намного хуже в более сложных логических выражениях.
Булевы аргументы должны обычно следует избегать. Рассмотрим функцию, определенную таким образом
void foo(bool option) { ... }
В теле функции очень ясно, что означает аргумент, поскольку у него удобное и, надеюсь, значимое имя. Но сайты вызовов выглядят так:
foo(TRUE);
foo(FALSE):
Здесь по существу невозможно сказать, что означает параметр, не глядя на определение или объявление функции, и становится намного хуже, если вы добавляете еще больше логических параметров.
@Thomas Matthews: Условные выражения считаются истинными, если они не равны нулю, но стандарт C требует, чтобы сами логические операторы возвращали либо 0, либо 1.
@Tom: #define TRUE! FALSE - это плохо и совершенно бессмысленно. Если заголовочный файл попадает в скомпилированный код C ++, это может привести к проблемам:
void foo(bool flag);
...
int flag = TRUE;
foo(flag);
Некоторые компиляторы выдают предупреждение о преобразовании int => bool. Иногда люди избегают этого, выполняя:
foo(flag == TRUE);
, чтобы выражение стало логическим значением C ++. Но если вы #define TRUE! FALSE, вы получите: