🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: alt.pl.comp.lang.csharp
Article #9687

Re: bledy popelniane przez programistow C#

#9687
From: Marcin Grzębski
Date: Wed, 02 Nov 2005 14:55
120 lines
6203 bytes
Jaroslaw Kowalski wrote:
>> Co jest w tym nieobiektowego? Przepraszam bardzo ale takiej
>> definicji obiektowości nie znam.
> 
> Jedną z podstawowych cech obiektowości jest (wybierz właściwe słowo):
> 
> 
> 1. encapsulation 2. hermetyzacja 3. enkapsulacja 4. kapsułkowanie
> (pozdrowienia dla p. JMD) 5. ... 6. ... 7. ...
> 
> Udostępnienie publicznego pola, po którym każdy z zewnątrz może pisać
> bez kontroli jest zaprzeczeniem tej idei.

Idei _pełnej_enkapsulacji_, tak.
Z Wikipedii:
"Z pełną enkapsulacją mamy do czynienia wtedy gdy dostęp do wszystkich
pól w klasie jest możliwy tylko i wyłącznie poprzez metody, lub inaczej:
gdy wszystkie pola w klasie znajdują się w sekcji prywatnej (lub
chronionej)."

Zgadzam się, że w większości przypadków da się tego paradygmatu
trzymać, ale w szczególnych przypadkach lepiej jest go pominąć
i nie wpłynie to na zachowanie obiektowości w kodzie.

>>> Wystarczyło zabronić ich stosowania i w każdym przypadku
>>> generować automatycznie właściwość z ukrytym polem prywatnym
>>> przechowującym stan.
>> 
>> No, to byłby naprawdę wynalazek na miarę "systemu totalitarnego 
>> programowania". Czy naprawdę tak ciężko jest samemu napisać kod
>> właściwości? Dlaczego odbierać komuś możliwość korzystania z pól
>> publicznych?
> 
> 
> Ależ skąd. Chodzi raczej o generowanie automatyczne właściwości 
> opakowujących te pola. W .NET masz rozróżnienie na pola i
> właściwości, gdzie raczej jest zgoda że w publicznych interfejsach
> należy używać właściwości. Gdyby wszystkie pola publiczne były przez
> kompilator tłumaczone jako właściwości (Property) a nie pola (Field)
> to zniknąłby problem kompatybilności binarnej.

W interfejsach (nie klasach) jak najbardziej, ponieważ tu faktycznie
upublicznianie pól jest b.kontrowersyją sprawą. Ale jeśli ktoś trzyma
się dobrego stylu OOP to nie utworzy interfejsu z polami. A napisanie:
int MyInt {get;set;}
naprawdę zajmuje tylko 10 znaków więcej.

>>> JITter dość dobrze radzi sobie z inline'owaniem takich
>>> konstrukcji jak trywialne get/set więc chyba nie powinno być
>>> problemu wydajnościowego. Zachowana zostałaby za to binarna
>>> kompatybilność kodu w przypadku zdefiniowania własnej operacji
>>> get/set w przyszłości.
>> 
>> Oczywiście wszystko da się zrobić. Ale jak to się ma do 
>> przejrzystości kodu i składni samego języka?
> 
> Mówię tylko o tym, że dla uniknięcia Field'ów w interfejsie
> publicznym kompilator mógłby tłumaczyć:
> 
> -------- public int Counter; --------
> 
> każdorazowo na
> 
> -------- private int _Counter; public int Counter { get { return
> _Counter; } set { _Counter = value; } } --------
> 
> public readonly typ nazwa; byłoby tłumaczone jako właściwość z
> akcesorem(?) get a pola prywatne zostałyby po staremu.

I tu się z Tobą nie zgadzam.
Podejrzewam, że dobre narzędzia UML wygenerowałyby taki
właśnie kod. Takie rzeczy powinny być załatwiane na poziomie
wspomagania pisania kodu, a nie na poziomie kompilatora.
Jeśli "ja" chcę mieć _pole_publiczne_ w klasie to chcę mieć
_pole_ , a nie własność. Jeśli chciałbym stworzyć prostą
klasę, z szybszym dostępem do wartości pól, to kompilator
mi na to nie pozwolił, bo stworzyłby właściwość, która
tak naprawdę jest 2 metodami. A "ja" nie chcę, żeby
kompilator przewidywał co ja od niego wymagam, ale chcę,
żeby kompilator robił to co "ja" mu każę.

>> Osobiście jestem przeciwnikiem tego co M$ zrobił ze składnią 
>> właściwości o różnych modyfikatorach dostępu, czyli:
>> 
>> public int IntValue { get { // ... } protected set { // ... } }
> 
> 
> A ja jestem za. W Soodzie bardzo chętnie bym powitał takie
> usprawnienie już w .NET 1.1. Chodzi głównie o możliwość ustawienia
> "set" jako "internal". Czyli biblioteka/assembly/pakiet kodu sama
> może zmodyfikować jakąś właściwość a klienci mogą tylko ją czytać.
> Obecnie muszę robić SetXXX() do ustawiania i int XXX { get; } do
> pobierania.

Ja także jestem ZA taką funkcjonalnością, ale jestem
przeciwko składni:
public int IntValue {
	get {...} //
	protected set {} //
}

Wolałbym coś takiego:

public int IntValue {
	get {...}
}
protected int IntValue {
	set  {...}
}

Za długie? No, może 2 linie więcej, ale osobiście wydaje mi
się, że dużo b.czytelniejsze. Od razu widać co jest publiczne
a co chronione. Nie muszę pamiętać, że dając protected przy
_get_ mogę dać private... (albo także internal) przy _set_.
Przecież własności to są zwykłe metody dlatego nie rozumiem
dlaczego M$ nie pozwolił na ich rozdzielenie.
Ale to takie moje prywatne żale.

pozdrawiam
Marcin
Technical Details
Message-ID: <dkak1h$p1l$1@atlantis.news.tpi.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.internetia.pl!newsfeed.tpinternet.pl!nemesis.news.tpi.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mail
References: <1130508326.894711.153970@z14g2000cwz.googlegroups.com> <1eocwqzx1mywz$.dlg@piotr-wlodarek.pl> <dk4mhr$r5s$1@atlantis.news.tpi.pl> <4f5ksod9hocm.dlg@piotr-wlodarek.pl> <dk4t9e$pk5$1@inews.gazeta.pl> <crxbo9q0fdfi.dlg@piotr-wlodarek.pl> <dk5fb4$dmh$1@nemesis.news.tpi.pl> <13nmve9r1u93s$.dlg@piotr-wlodarek.pl> <dk7dd9$6rv$1@node1.news.atman.pl> <dka85j$mnh$1@nemesis.news.tpi.pl> <dkaa5t$1842$1@node3.news.atman.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.internetia.pl!newsfeed.tpinternet.pl!nemesis.news.tpi.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mail
From: Marcin Grzębski <mgrzebski@taxussi.no.com.spam.pl>
Newsgroups: alt.pl.comp.lang.csharp
Subject: Re: bledy popelniane przez programistow C#
Date: Wed, 02 Nov 2005 15:55:37 +0100
Organization: tp.internet - http://www.tpi.pl/
Lines: 120
Message-ID: <dkak1h$p1l$1@atlantis.news.tpi.pl>
References: <1130508326.894711.153970@z14g2000cwz.googlegroups.com> <1eocwqzx1mywz$.dlg@piotr-wlodarek.pl> <dk4mhr$r5s$1@atlantis.news.tpi.pl> <4f5ksod9hocm.dlg@piotr-wlodarek.pl> <dk4t9e$pk5$1@inews.gazeta.pl> <crxbo9q0fdfi.dlg@piotr-wlodarek.pl> <dk5fb4$dmh$1@nemesis.news.tpi.pl> <13nmve9r1u93s$.dlg@piotr-wlodarek.pl> <dk7dd9$6rv$1@node1.news.atman.pl> <dka85j$mnh$1@nemesis.news.tpi.pl> <dkaa5t$1842$1@node3.news.atman.pl>
NNTP-Posting-Host: 199.wmok.net
Mime-Version: 1.0
X-Trace: atlantis.news.tpi.pl 1130943345 25653 217.96.29.199 (2 Nov 2005 14:55:45 GMT)
X-Complaints-To: usenet@tpi.pl
NNTP-Posting-Date: Wed, 2 Nov 2005 14:55:45 +0000 (UTC)
User-Agent: Mozilla Thunderbird 1.0 (Windows/20041206)
X-Accept-Language: en-us, en
In-Reply-To: <dkaa5t$1842$1@node3.news.atman.pl>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit