C# vs Java: properties
Добавлено: 06 июн 2009, 17:20
Я писал как-то о том, что был приятно удивлён, насколько хорошо разработан язык C# и какие дополнительные вкусности у него есть в сравнении с Java. Теперь же подойду более критично.
Например, возьмём так часто упоминаемые properties: имитацию доступа к свойствам объекта через скрытые get/set функции. Такое есть не только в C#, но и, скажем, в Ruby, Scala, Python. В Python, правда, это реализовано достаточно криво, на мой взгляд.
C#
Сторонники использования properties утверждают, что доступ через "." (obj.Bar = a;) компактнее, чем через getX()/setX() (obj.setBar(a);), и что при желании доступ к полю можно заменить на property с логикой в get/set произвольной сложности, не обязательно примитивные доступ к полю и присваивание, как в примере выше.
На практике же, использование properties зачастую сводится именно к такому, как показано выше. Разве что с вариациями, когда имеется только read-only или write-only доступ. Для таких случаев как раз Ruby очень грамотно разработан с его attr_reader, attr_writer, etc.. И это правильно. Большего, чем пометить доступ к полю, как read или write-only и не надо было бы.
Удобство компактной нотации, подобной доступу к обычному public field, опять же спорно, особенно, если за property's getters/setter кроется сложная временезатратная логика. Так, скажем, простейший obj.Foo = bar; может превратиться в скрытую пожиралку компьютерных ресурсов, так как от нотации доступа к полю привычно ожидается просто присваивание объекта, а не дополнительная работа помимо этого.
И, вообще, и public доступ к полям, и имитация этого доступа через properties -- это кощунство над объектно-ориентированным программированием. Наглое попрание одной из его основных концепций -- инкапсуляции. Не для того городился весь этот огород с разными уровнями доступа, чтобы так насмехаться над ним.
Так что, мне кажется, Java пока что ещё следует правильным путём. Насколько я знаю, в Java SE 7 даже и не планировалось включать механизм properties.
Например, возьмём так часто упоминаемые properties: имитацию доступа к свойствам объекта через скрытые get/set функции. Такое есть не только в C#, но и, скажем, в Ruby, Scala, Python. В Python, правда, это реализовано достаточно криво, на мой взгляд.
C#
Код: Выделить всё
public class Foo {
private string bar;
public string Bar {
get { return bar; }
set { bar = value; }
}
}
На практике же, использование properties зачастую сводится именно к такому, как показано выше. Разве что с вариациями, когда имеется только read-only или write-only доступ. Для таких случаев как раз Ruby очень грамотно разработан с его attr_reader, attr_writer, etc.. И это правильно. Большего, чем пометить доступ к полю, как read или write-only и не надо было бы.
Удобство компактной нотации, подобной доступу к обычному public field, опять же спорно, особенно, если за property's getters/setter кроется сложная временезатратная логика. Так, скажем, простейший obj.Foo = bar; может превратиться в скрытую пожиралку компьютерных ресурсов, так как от нотации доступа к полю привычно ожидается просто присваивание объекта, а не дополнительная работа помимо этого.
И, вообще, и public доступ к полям, и имитация этого доступа через properties -- это кощунство над объектно-ориентированным программированием. Наглое попрание одной из его основных концепций -- инкапсуляции. Не для того городился весь этот огород с разными уровнями доступа, чтобы так насмехаться над ним.
Так что, мне кажется, Java пока что ещё следует правильным путём. Насколько я знаю, в Java SE 7 даже и не планировалось включать механизм properties.