Вопрос

Допустим, у вас есть переменная с именем отельНедвижимостьНомер.Содержимое всегда будет числом, но обычно используется как строка.Будет ли что-то «неправильное» в объявлении его как строки, чтобы вам не приходилось постоянно преобразовывать его в строку... или это плохая привычка программирования?

Спасибо.

Это было полезно?

Решение

Число – это математический объект, используемый для счета и измерения.Если для подсчета вы используете номер отеляPropertyNumber, т.е.применять к нему любые арифметические действия, это является число и должно храниться как числовой тип.

Если нет, то это не является число;это строка.

Другие советы

В некоторых языках вы можете создать пользовательский тип, например «class HotelPropertyNumber", который:

  • Поддерживает именно те методы, которые вам нужны
  • Может хранить свои данные внутри себя в виде строки.
  • Может проверить (в своем конструкторе), что его значение имеет числовой синтаксис.
  • Не следует путать с другими экземплярами числовых и/или строковых типов, которые не являются экземплярами HotelPropertyNumber.

Всегда храните информацию в самой простой форме.В данном случае целое число.При необходимости преобразуйте его в строку.Почти во всех языках это делается практически безболезненно, особенно при преобразовании целого числа в строку.

Хороший пример этого был в Подкаст StackOverflow № 58, когда Джефф сохранил в базе данных HTML-код заголовка, а не только сам заголовок.Это вызвало множество проблем, когда он хотел позже добавить функциональность и отобразить заголовок там, где HTML не нужен.

ChrisW также поднимает важный вопрос: это утверждает безопасность типа.Я подумал, что это достаточно важно, чтобы отметить.

Это зависит от того, что вы хотите с ними делать.

Вы, вероятно, никогда не будете выполнять с ними арифметические операции, но как насчет сортировки?Целые числа сортируются иначе, чем строки.Вы хотите, чтобы они были 1, 10, 2 и т. д.?Если нет, то используйте целые числа или специальный метод сортировки.

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

Игорь Кровоконь уже говорил об этом, но я хотел бы немного уточнить.

Как вы думаете, почему содержимое номера отеля является числом?«12» — это не число.Это строка, содержащая пару цифр.Вы не можете извлечь квадратный корень из комнаты № 153, но можете сделать это из числа 153.

Номер гостиничного номера не имеет значения. вести себя как число.Число — это математическое понятие, и его можно представить в текстовом виде множеством разных способов.Число 14 можно записать как XIV римскими цифрами, «четырнадцать», или 0xfe в шестнадцатеричном формате, или 11111110 в двоичном формате.Но персонал отеля, скорее всего, бросит на вас очень странный взгляд, если вы попросите «номер один-один-один-один-один-один-ноль».

Номера гостиничных номеров не являются математическими числами, поэтому их не следует представлять в виде целых чисел.

Тогда они веревочные?Да, более или менее, но, как вы заметили, у них есть несколько дополнительных ограничений.

Не каждая строка является действительным номером отеля.«14» — хорошо, а «Арбуз» — нет.

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

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

Я согласен с @Eric.Вы обнаружите, что если вы объявите его как строку, вы допустите ошибки, анализируя его как int или применяя его как int.Просто используйте int.

Нет, не обязательно неправильно.Но вы можете рассмотреть возможность переименования переменной, чтобы отразить, что это строка.Я не думаю, что есть простой ответ на вопрос, следует ли вам сохранять число или преобразовывать его в строку.Это зависит от ситуации.Если вы решите сохранить его как целое число в своем приложении и вам придется преобразовать его в строку 1000 раз в своем коде, возможно, стоит выполнить преобразование в строку один раз.Вам придется рассмотреть компромиссы в зависимости от ситуации.

Я не согласен с Эриком.

В разработке нет правил «Всегда».

Если вы используете эту переменную в основном как строку, то имеет смысл сохранить ее как строку и потерять «число» из имени переменной.

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

Имеет ли смысл изменить имя на hotelPropertyIdentifier?Это могло бы избежать всех коннотаций, связанных с вызовом какого-то числа.

Вы всегда можете создать общедоступную функцию HotelPropertyNumber(), которая возвращает число в виде строки, но целое число по-прежнему остается скрытым.

Если вы решите, что вам действительно не нужен int под обложкой, HotelPropertyNumber() может просто вернуть частную строку.

Никогда не говори всегда.Оно не всегда может быть представлено цифрами.14, например, можно разделить на 14a и 14b.Или 21 и 22 можно объединить в 21-22.Это более вероятно, чем заниматься с ними арифметикой.

Посмотрите на уличные адреса, которые обычно начинаются с цифры.(Тоже довольно близкая аналогия.)

Это не плохой привычка сама по себе, но в дальнейшем это может привести к неприятностям.

Говорю теперь из личного опыта:Раньше я был большим поклонником хранения числовых значений, которые всегда использовались в виде строки в строковых переменных.Я имею в виду, почему бы и нет, верно?Это избавит вас от всех этих утомительных кастингов и прочего, и вы сможете приступить к сути проблемы.(Конечно, это решает, что заказать на обед.)

Затем я провел большую часть дня, пытаясь выяснить, почему живая система выдает всевозможные безумные исключения.Оказывается, цифра «1», которую я смотрел в данных, на самом деле была строчной буквой «l».

И тут, как говорится, я стал просветленным.

(Конечно, это действительно может меняться в зависимости от того, на каком языке вы говорите.В чем-то вроде Java все эти проблемы решаются несколькими строками определения класса.В Python или Perl этот вопрос даже ничего не значит — язык просто «понимает это правильно».Ну, во всяком случае, для некоторого определения «правильного».)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top