236 Глава 15. Особенности создания кода
4. Иногда бывает нужен только один объект с определенной структурой и
поведением. Например, нужен объект, работа которого состоит в управле-
нии некоторым уникальным ресурсом — файловой системой или таблицей
поиска. При таких обстоятельствах соблазнительно сделать такой объект
классом. Другими словами, кажется логичным создать специальный класс
и написать методы класса, которые будут выполнять всю работу, особенно
если объект нуждается в ярком, уникальном, хорошо понимаемом имени.
Однако такой способ создания подобного объекта — не самый лучший.
Намного лучше — создать класс, и создать его единственный экземпляр, ко-
торый и будет реально работать. Основная причина такого решения состоит
в том, что никогда нельзя быть уверенным, что в один прекрасный день не
потребуется создать еще один столь же уникальный экземпляр. Кроме того,
при создании экземпляра ваш уникальный объект будет наследовать только
функциональные возможности экземпляров, а не неподобающие ему функ-
циональные возможности классов. Не забывайте, что наследование только
нужных функциональных возможностей — один из тех принципов, которо-
му надо неукоснительно следовать при проектировании классов.
В подобной ситуации один из практических способов решения со стоит
в том, чтобы создать класс и определить в нем переменную класса с име-
нем Default (ЗначениеПоУмолчанию). Затем создать метод класса с именем
initialize, который инициализирует эту переменную так, чтобы она содер-
жала требуемый единственный экземпляр данного класса. В заключение
остается создать метод класса с именем default, который будет возвращать
значение переменной Default. После этого, когда в какой-то части кода надо
использовать этот объект, достаточно вычислить выражение MyClassName
default. Теперь, е сли вдруг потребуется создать более одного экземпляра
такого класса, не возникнет никаких проблем.
5. Стоит обратить внимание на отношение к коду, расположенному в иерар-
хии классов. Предоставление любой системой Смолток почти полного ис-
ходного текста своей реализации позволяет изменять классы системы. Это
очень мощное средство, и подобно всем таким средствам, к нему следует
относиться с осторожностью. Абсолютно не верен постулат, что нельзя из-
менять классы из поставляемой иерархии. Если надо добавить новые функ-
циональные возможности, это нужно делать. Такой вид изменений делает
среду разработки более мощной, чем она есть.
Совсем другое дело, если планируются изменения в наиболее фунда-
ментальных классах, типа классов Object или Behavior. В этом случае надо
быть чрезвычайно осмотрительным. На этом пути есть две опасности. Во-
первых, можно разрушить систему, и, во-вторых, можно произвести в ней
изменения, несовместимые с изменениями, проведенными кем-то еще.