Булевы переменные используются для хранения данных, которые могут принимать только два возможных значения. Проблемы, возникающие при их использовании, часто упускаются из виду:
В этих случаях использование булевых переменных приводит к запутанному коду, который часто можно предотвратить с помощью перечислений.
Пример
Скажем, программист пишет программное обеспечение для автосалона, который продает только легковые и грузовые автомобили. Программист разрабатывает тщательную модель бизнес-требований для своего программного обеспечения. Зная, что единственными проданными типами транспортных средств являются легковые и грузовые автомобили, он правильно определяет, что может использовать логическую переменную внутри класса Vehicle, чтобы указать, является ли транспортное средство легковым или грузовым автомобилем.
class Vehicle {
bool isTruck;
...
}
Программное обеспечение написано так, что когда isTruck
является истиной, транспортное средство является грузовиком, а когда isTruck
является ложным, транспортное средство является автомобилем. Это простая проверка, выполняемая много раз по всему коду.
Все работает без проблем, пока однажды автосалон не купит другой автосалон, который также продает мотоциклы. Программист должен обновить программное обеспечение, чтобы оно работало правильно, учитывая, что бизнес дилерского центра изменился. Теперь необходимо определить, является ли транспортное средство легковым, грузовым автомобилем или мотоциклом, три возможных состояния.
Как программист должен это реализовать? isTruck
является логической переменной, поэтому она может содержать только два состояния. Он может изменить его с логического на другой тип, который допускает много состояний, но это нарушит существующую логику и, возможно, не будет обратно совместимым. Самым простым решением с точки зрения программиста является добавление новой переменной, чтобы представить, является ли транспортное средство мотоциклом.
class Vehicle {
bool isTruck;
bool isMotorcycle;
...
}
Код изменяется так, что когда isTruck
истинно, транспортное средство является грузовиком, когда isMotorcycle
истинно, транспортное средство является мотоциклом, и когда они оба ложны, транспортное средство является автомобиль.
Проблемы
Есть две большие проблемы с этим решением:
Разработчик не виноват в том, что бизнес-требования его программного обеспечения изменились, что потребовало от него пересмотра существующего кода. Но использование булевых переменных в первую очередь сделало его код менее гибким и трудным для изменения, чтобы удовлетворить неизвестные будущие требования (менее «ориентированные на будущее»). Когда он реализовал изменения самым быстрым способом, код стал труднее читать. Использование логической переменной в конечном итоге было преждевременной оптимизацией.
Решение
Использование перечисления в первую очередь предотвратило бы эти проблемы.
enum EVehicleType { Truck, Car }
class Vehicle {
EVehicleType type;
...
}
Чтобы приспособить мотоциклы в этом случае, все, что должен сделать программист, это добавить Motorcycle
в EVehicleType
и добавить новую логику для обработки мотоциклетных дел. Нет необходимости добавлять новые переменные. Существующая логика не должна нарушаться. И тот, кто не знаком с кодом, может легко понять, как хранится тип транспортного средства.
Заметки Клиффа
Не используйте тип, который может хранить только два разных состояния, если вы не уверены, что двух состояний всегда будет достаточно. Используйте перечисление, если есть какие-либо возможные условия, при которых в будущем потребуется более двух состояний, , даже если логическое значение будет соответствовать существующим требованиям . [Тысяча сто тридцать два]
dbo - это схема по умолчанию в SQL Server. Вы можете создавать свои собственные схемы, чтобы лучше управлять пространством имен объектов.
Если вы используете Sql Server Management Studio, вы можете создать свою собственную схему, перейдя в Базы данных - Ваша база данных - Безопасность - Схемы.
Создать схему с использованием сценария так же просто, как (например):
CREATE SCHEMA [EnterSchemaNameHere] AUTHORIZATION [dbo]
Вы можете использовать их для логической группировки таблиц, например, создав схему для «финансовой» информации, а другую - для «личных» данных. Ваши таблицы будут отображаться как:
Financial.BankAccounts Финансовые операции Personal.Address
Вместо использования схемы dbo по умолчанию.