C# vs Java: properties

Все, что вы хотели знать о программизме, но боялись спросить.
badger

C# vs Java: properties

Сообщение badger »

Я писал как-то о том, что был приятно удивлён, насколько хорошо разработан язык C# и какие дополнительные вкусности у него есть в сравнении с Java. Теперь же подойду более критично.

Например, возьмём так часто упоминаемые 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 утверждают, что доступ через "." (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.
Malysh'ka
Маньяк
Сообщения: 1730
Зарегистрирован: 18 май 2005, 04:04
Откуда: Burnaby

Re: C# vs Java: properties

Сообщение Malysh'ka »

Не поняла, каким это образом геттеры/сеттеры попирают инкапсуляцию.
badger

Re: C# vs Java: properties

Сообщение badger »

Malysh'ka писал(а):Не поняла, каким это образом геттеры/сеттеры попирают инкапсуляцию.
Public доступ к полям (и имитация этого доступа через properties) попирает, не геттеры/сеттеры. Хотя и геттеры/сеттеры попирают, если на каждое поле x мы имеем getX()/setX(). Я считаю, надо стараться этого избегать. Это требуется только для специфичных задач, скажем, представление записи, содержащей набор полей, в виде класса и автоматизации доступа к полям через getters/setters. То есть, все эти JavaBean и подобные штуки.

Иначе где же здесь инкапсуляция и OOD вообще? Внутренняя структура объекта и public методы управления объектом не должны быть завязаны напрямую одни на другие. На то она и внутреняя структура, чтобы её полностью скрыть.
Malysh'ka
Маньяк
Сообщения: 1730
Зарегистрирован: 18 май 2005, 04:04
Откуда: Burnaby

Re: C# vs Java: properties

Сообщение Malysh'ka »

А, то есть если не на каждое поле, а через одно, то не попирают? :) А что Вы инкапсуляцией называете тогда, можно уточнить? Я не применительно к С# которого не знаю, а вообще.
Аватара пользователя
Marmot
Графоман
Сообщения: 39283
Зарегистрирован: 17 фев 2003, 17:58
Откуда: Caulfeild
Контактная информация:

Re: C# vs Java: properties

Сообщение Marmot »

Спор это давний и, в контексте Каморки, достаточно бессмысленный :)
Тут вам не что-то типа LtU :)
Если бы практическая ценность языка программирования зависела от его концептуальной целостности и идеологической последовательности, то мы бы не увидели расцвета PHP и клинической смерти Smalltalk-а.

Хотелось бы добавить слегка относящихся к делу наблюдений, я в последнее время все больше и больше делаю final (Java) properties.
И очень удобно их делать еще и public и работать с ними напрямую откуда угодно.
Инкапсуляция от этого страдает несильно :) , а удобство определенное заметно. Ну и оптимизируется такое hotspot-ом на ура.
badger

Re: C# vs Java: properties

Сообщение badger »

Malysh'ka писал(а):А, то есть если не на каждое поле, а через одно, то не попирают? :)
Какая Вы... юморная, я смотрю. Конечно же попирают. И даже через два поля. И через три.
А что Вы инкапсуляцией называете тогда, можно уточнить? Я не применительно к С# которого не знаю, а вообще.
Да там без разницы, что C#, что другой более-менее правильный ОО язык. Так что ничего нового я Вам не сообщу. Инкапсуляцией я называю то же, что и все. Насчёт C# я проехался, собственно, только по properties (пока ещё).

Надеюсь, понаопределяя private полей x и public методов а-ля getX()/setX(), единственная функция которых вернуть или присвоить значение x, Вы не рискнёте утверждать, что в подобном классе имела место инкапсуляция данных, представленных этим x. Её там и близко не будет, что видно уже исходя из самих названий методов.
badger

Re: C# vs Java: properties

Сообщение badger »

Marmot писал(а):Хотелось бы добавить слегка относящихся к делу наблюдений, я в последнее время все больше и больше делаю final (Java) properties.
И очень удобно их делать еще и public и работать с ними напрямую откуда угодно.
Инкапсуляция от этого страдает несильно :) , а удобство определенное заметно. Ну и оптимизируется такое hotspot-ом на ура.
Вот! А я как раз ждал случая, упомянет кто-нибудь это или нет. Респект. Согласен, что в подобных случаях и нет смысла инкапсулировать. Всему своё место. И final прекрасно делает своё дело.
Malysh'ka
Маньяк
Сообщения: 1730
Зарегистрирован: 18 май 2005, 04:04
Откуда: Burnaby

Re: C# vs Java: properties

Сообщение Malysh'ka »

Marmot писал(а):Спор это давний и, в контексте Каморки, достаточно бессмысленный :)
Тут вам не что-то типа LtU :)
Ладно, согласна :) А что такое LtU?
badger

Re: C# vs Java: properties

Сообщение badger »

Malysh'ka писал(а):
Marmot писал(а):Спор это давний и, в контексте Каморки, достаточно бессмысленный :)
Тут вам не что-то типа LtU :)
Ладно, согласна :) А что такое LtU?
Это такой класснецкий сайт: http://lambda-the-ultimate.org/
Malysh'ka
Маньяк
Сообщения: 1730
Зарегистрирован: 18 май 2005, 04:04
Откуда: Burnaby

Re: C# vs Java: properties

Сообщение Malysh'ka »

Прикольный сайт. Ещё более согласна :)
badger

Re: C# vs Java: namespaces and packages

Сообщение badger »

...ещё не нравится в C# то, как определяются namespaces. Всё, что принадлежит какому-то namespace, должно определяться в его блоке.

Код: Выделить всё

namespace SampleNamespace 
{
    class SampleClass {}
    .....
}
Что приводит к дополнительному уровню отступа. А учитывая, что, как правило, namespace задаётся на весь файл, такая синтаксическая конструкция выглядит совершенно излишней.

Мне ближе Common Lisp подобная нотация (такая же в Java и Scala), когда в начале файла указывается, к какому package принадлежит этот файл. Это намного читабельнее, не загромождает код.
Аватара пользователя
aissp
Маньяк
Сообщения: 2710
Зарегистрирован: 07 ноя 2005, 09:51

Re: C# vs Java: properties

Сообщение aissp »

отмени отступ, ето довльно просто :)

по сути дискусси, я понимайт, что слово написанное на заборе требует, что называется отмщения словом, мне кажется надо давить в себе ети порывы, дабы не попасть в плеяду графоманов имя которым легион...

извините, сорвалось при прочтенни сей глубокой дискуссии...
badger

Re: C# vs Java: properties

Сообщение badger »

aissp писал(а):отмени отступ, ето довльно просто :)
Дело не во мне. Я-то могу отменить, но не я один пишу. Как правило, отступ не отменяют, судя по тем C# исходникам, что я видел.
по сути дискусси, я понимайт, что слово написанное на заборе требует, что называется отмщения словом, мне кажется надо давить в себе ети порывы, дабы не попасть в плеяду графоманов имя которым легион...
Слабо понимаю, что ты хотел этим сказать. Похоже, ты был пьян, когда писал.
извините, сорвалось при прочтенни сей глубокой дискуссии...
Да весь форум полон подобной глубокой дискуссии. Даже "глубжее" бывает. Так что не знаю, чего это у тебя срывается в конкретных местах.
Аватара пользователя
aissp
Маньяк
Сообщения: 2710
Зарегистрирован: 07 ноя 2005, 09:51

Re: C# vs Java: properties

Сообщение aissp »

почему? вполне трезв.
мне (как и кучи моим знакомым:)) отступы не мещают, тем кому мешают, те их отменяют. Сеттеры и геттеры - ну не нравятся не используй, не нравится for используй while. Уж не знаю, какие философские концепции чего нарущают, моя сугубоъая точка зрения. язык программирования должен быть таким, чтобы позволял лично мне делать деньги, желательно с наименьшеими усилиями...
Зачем делать философские проблемы из ничего?

Впрочем извини, не в курсе, что ты работаешь в комитете по стандартизации, там и в правду это основные проблемы.

Мне, просто програмисту, все ети дискуссии вызывают, ать соврал, ничего не вызывают, так вот по инерции и от нечего делать пишу.
badger

Re: C# vs Java: properties

Сообщение badger »

aissp писал(а):почему? вполне трезв.
мне (как и кучи моим знакомым:)) отступы не мещают, тем кому мешают, те их отменяют. Сеттеры и геттеры - ну не нравятся не используй, не нравится for используй while. Уж не знаю, какие философские концепции чего нарущают, моя сугубоъая точка зрения. язык программирования должен быть таким, чтобы позволял лично мне делать деньги, желательно с наименьшеими усилиями...
Зачем делать философские проблемы из ничего?
Да никакой философской проблемы здесь нет. Мне языки программирования интересны не только, как просто инструменты для зарабатывания денег, но и с точки зрения дизайна, соответствия заявленной парадигме программирования (ООП, функциональной и т.д.) Собственно, я только об этом и написал. В чём проблема?

Фразы вроде "не нравится, не используй" здесь не катят.
Впрочем извини, не в курсе, что ты работаешь в комитете по стандартизации,
Извинятся не надо. Ты много ещё чего не знаешь.
там и в правду это основные проблемы.
Свои основные проблемы я на форумах не обсуждаю. Или ты сюда только основные проблемы заходишь обсудить?
Мне, просто програмисту, все ети дискуссии вызывают, ать соврал, ничего не вызывают, так вот по инерции и от нечего делать пишу.
Если ты просто программист, кодер, стучальщик по клавишам, то ничего и не говори. Значит тема не для тебя.
Закрыто