Важно помнить, что вызовы функций обеспечивают универсальный интерфейс. Любой объект может взаимодействовать с другими объектами с помощью вызовов функций. Все, что вам нужно сделать, это определить правильные подписи, и все готово. Единственная загвоздка в том, что вы должны взаимодействовать исключительно через эти вызовы функций, которые часто работают хорошо, но в некоторых случаях могут быть неуклюжими.
Основной причиной прямого предоставления переменных состояния является возможность использования примитивных операторов непосредственно в этих полях. Если все сделано правильно, это может улучшить читаемость и удобство: например, добавление комплексных чисел с +
или доступ к коллекции с ключом с помощью []
. Преимущества этого могут быть неожиданными, при условии, что вы используете синтаксис в соответствии с традиционными соглашениями.
Загвоздка в том, что операторы не являются универсальным интерфейсом. Их может использовать только очень специфический набор встроенных типов, их можно использовать только так, как ожидает язык, и вы не можете определить какие-либо новые. Итак, как только вы определили свой общедоступный интерфейс с помощью примитивов, вы заперли себя в использовании этого примитива и только этого примитива (и других вещей, которые можно легко привести к нему). Чтобы использовать что-то еще, вы должны танцевать вокруг этого примитива каждый раз, когда взаимодействуете с ним, и это убивает вас с СУХОЙ точки зрения: вещи могут очень быстро стать очень хрупкими.
Некоторые языки превращают операторы в универсальный интерфейс, но Java — нет. Это не обвинение в адрес Java: его разработчики намеренно решили не включать перегрузку операторов, и у них были веские причины для этого. Даже когда вы работаете с объектами, которые, кажется, хорошо согласуются с традиционными значениями операторов, заставить их работать таким образом, который действительно имеет смысл, может быть удивительно много нюансов, и если вы не совсем поймете это, вы собираетесь заплатите за это позже. Часто намного проще сделать интерфейс, основанный на функциях, читабельным и удобным для использования, чем выполнять этот процесс, и вы часто даже получаете лучший результат, чем если бы вы использовали операторы.
Однако при принятии этого решения были компромиссы. Бывают случаи, когда интерфейс на основе оператора действительно работает лучше, чем интерфейс на основе функций. , но без перегрузки оператора эта опция просто недоступна. Попытка втиснуть операторов в работу в любом случае приведёт вас к некоторым дизайнерским решениям, которые вы, вероятно, не хотите закреплять в камне. Разработчики Java посчитали, что этот компромисс оправдан, и, возможно, они были правы в этом вопросе. Но решения, подобные этому, не приходят без последствий, а именно в таких ситуациях и возникают последствия.
Короче говоря, проблема не в раскрытии вашей реализации как таковой. Проблема заключается в том, чтобы запереть себя в этой реализации.
person
The Spooniest
schedule
20.02.2014