| 27. Два вида свободы | |
| Существует два вида свободы — хорошая и плохая. Когда-то давно, когда еще никто толком не умел программировать, когда главным критерием качества программы был критерий «программа работает», программисты радовались любой свободе, которая им предоставлялась, совершенно не задумываясь о том, хорошая это свобода, или плохая. | |
| Любое стороннее решение, будь то полноценная библиотека или единственный класс, предоставляют вам определенную функциональность, а вместе с ней и некоторую свободу действий. | |
| Оличить плохую свободу от хорошей очень просто. Хорошая свобода предполагает легкость отказа от предоставленных услуг. Плохая вобода предполагает чрезмерную сложность отказа от услуг, предоставленных сторонним решением. | |
| Базовый класс и виртуальные функции, паттерн «Visitor», паттерн «Variant», паттерн «Factory», слишком вычурная сериализация — все это примеры плохой свободы. Да, перечисленные механизмы решают поставленные перед ними задачи, однако подумайте, каких усилий будет стоить отказ от любого из этих механизмов в уже существующей системе. | |
| STL-совместимые контейнеры, паттерн «Adapter», библиотека boost::function и boost::bind — это примеры хорошей свободы, поскольку отказ от любого из этих механизмов в пользу любого стороннего аналога пройдет для вас легко и безболезненно. | |
| Плохая свобода это искусственные и не стандартизованные правила. Плохая свобода это предъявления требований к типам и интерфейсам. Плохая свобода это требования, взятые с потолка. | |
| Хорошая свобода это минимальные требования, либо их полное отсутствие. Хорошая свобода это требования к семантике, а не к интерфейсу. Хорошая свобода всегда стандартизована, обоснована и оптимальна. | |
| Используйте механизмы, предоставляющие хорошую свободу. Адаптируйте плохую свободу в хорошую. В собственных решениях предлагайте пользователю минимальные и стандартизованные правила игры. | |