Подклассы SmallInteger для представления числовых вещей? - PullRequest
3 голосов
/ 27 апреля 2019

Я хочу представить телефонный код страны (например, 46 для Швеции или 54 для Аргентины).Это небольшое положительное целое число.

1) Является ли подкласс SmallInteger хорошей идеей для моделирования этого?

При попытке в браузере кода я получаю:

SmallInteger immediateSubclass: #CountryCode

2) Я не знаю, что означает immediateSubclass:, в отличие от subclass:.

3) Как я могу создать экземпляр моего CountryCode?как SmallIntegers может быть создан только арифметикой?

Я знаю, что могу использовать инкапсуляцию и просто иметь SmallInteger внутри моего собственного CountryCode класса.

Спасибо!

Ответы [ 4 ]

3 голосов
/ 27 апреля 2019
  1. Состав, как правило, предпочтительнее, чем подклассы, когда это возможно.Подклассирование базового класса, такого как SmallInteger, в частности, не является хорошей идеей (и может не работать вообще), потому что 2

  2. Классы, определенные как immediateSubclass:, являются подклассами специального случая, обрабатываемымиВМ.Вместо указателя объекта значение сохраняется непосредственно в заголовке объекта.Я считаю, что виртуальная машина должна знать о каждом конкретном виде immediateSubclass: для обработки кодирования / декодирования / генерации кода JIT.

  3. Вы уже начинаете видеть проблему с созданиемчисловой подкласс.(будут и другие). Вы можете создать подкласс Object и использовать его в качестве прокси для числового ивара, но он, вероятно, не будет достаточно хорош сам по себе, чтобы быть полностью убедительным в виде числа, если ваш объект будет протестирован с #isKindOf: и т. д. Если вы на самом деле хотите сделать это, вы, вероятно, захотите сделать свой класс подклассом Integer с вашим числовым иваром внутри, а затем сделайте все обычные вещи, которые вы бы сделали для его прокси.(т. е. либо создайте все необходимые методы для производительности и отладки, либо внедрите #doesNotUnderstand: для пересылки сообщений на него и устранения недостатков)

Тем не менее, спросите себя, почему вам действительно нужносделать это для кода страны?Да, это число, но действительно ли вы собираетесь делать с ним числовые операции (сложение двух кодов стран, кода страны * 10, что означает квадратный корень из кода страны и т. Д.), Которое вам нужно специализировать иликод просто числовое значение без особого поведения?Я подозреваю, что лучшим решением было бы создание класса Country или CountryCode в качестве подкласса Object или некоторого другого класса модели верхнего уровня.Затем вы можете добавить ivar для кода страны (который, скорее всего, будет SmallInteger), другой для названия страны и т. Д. И добавить к нему метод #asInteger или #asNumber, если необходимо.

2 голосов
/ 27 апреля 2019

Инкапсуляция кода страны, скажем, в классе TelephoneNumber должна быть достаточной, не так ли?

Полагаю, вам может потребоваться сопоставление между странами и кодами, а также какое-то средство для анализа и проверки строки телефонного номера. Чего я не вижу, так это необходимости моделировать код в своем собственном классе.

Следовательно, я бы попробовал инкапсуляцию и оставался с ней до тех пор, пока не доказал свою неправоту (что должно стать очевидным).

2 голосов
/ 27 апреля 2019

1) В чем выгода наследования от целого числа? Выполнить арифметику по коду страны? Код страны требует класса вообще? Для какого поведения?

2) непосредственный подкласс - это деталь реализации. Обычный объект - это указатели (объектно-ориентированные указатели). Непосредственные объекты содержат данные вместо указателя. Они распознаются виртуальной машиной, имея младшие биты, отличные от нуля. Обычный адрес выровнен на 4 8 или 16 байтов и младшие биты установлены в ноль.

3) Вы не можете создать непосредственный объект, вы не можете выделить память (новую), и вы также не можете подклассировать их. Только виртуальная машина может, и да, это всегда с помощью арифметики для SmallInteger.

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

0 голосов
/ 01 мая 2019
  1. Нет, не рекомендуется делать код страны подклассом SmallInteger.
  2. Я не знаю, что такое «непосредственный подкласс» в этой ситуации. Давайте пока проигнорируем этот бит.
  3. Давайте представим, что вы создали вашу Телефонную Страну как подкласс Object; и вы создали метод класса с помощью селектора #code: который создает новый экземпляр, устанавливает для переменной экземпляра с именем «code» значение параметра и возвращает новый экземпляр. Вы должны отправить это сообщение в ваш класс, чтобы создать экземпляр TelephoneCountry, например:

    страна: = телефонный код страны: 46.

    Позже вы можете запросить у этой страны ее название или код.

    n: = название страны. c: = код страны.

Конечно, вам нужно написать каждый из этих методов тоже.

...