🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #297880

Podprocedury w C#

#297880
From: Wojciech Spook Sura
Date: Sun, 07 Aug 2011 18:28
71 lines
4020 bytes
Hej!

Kłóciłem się kiedyś z kumplem, który twierdził, że podprocedury są w  
języku zupełnie zbędne, że potrzeba ich zastosowania świadczy o  
design-flaw i że nie istnieje taka funkcja (którą chciałbym napisać jako  
podprocedurę), która nie może przydać się w przyszłości (co miało być  
argumentem za tym, żeby podprocedurę umieścić jako prywatną lub chronioną  
metodę w klasie - zwiększając tym samym zakres jej widoczności).

Napotkałem jednak sytuację, która wydaje się przeczyć powyższej  
argumentacji.

Otóż mam dwie listy do przetworzenia. Większość elementów występuje w obu  
listach, ale część jest tylko na jednej lub drugiej, np.

A - A
B - C
C - D
E - E

Algorytm musi przetworzyć wszystkie elementy, przy czym jeśli element  
występuje w obu listach, przetwarzany jest jako para, zaś jeśli tylko na  
jednej, to jest uzupełniany nullem. Czyli metoda przetworzy następujące  
pary:

(A, A)
(B, null)
(C, C)
(null, D)
(E, E)

Oczywiście elementy lewo- i prawostronne są rozróżniane. Mniejsza zresztą  
o sposób działania algorytmu.

Proces przetwarzania pary kompletnej od pary uzupełnionej nullem różni się  
dosyć znacząco, natomiast różnica pomiędzy przetworzeniem (<obj>, null), a  
(null, <obj>) jest niewielka i sprowadza się do jednej zmiennej typu  
wyliczeniowego, która przyjmuje różne wartości, w zależności od tego, czy  
null jest po lewej, czy po prawej stronie.

Naturalnym wydaje się - żeby uniknąć jednej, wielgachnej metody w połowie  
napisanej na zasadzie copy'n'paste - ubrać przetwarzanie pary oraz  
niepełnej pary w osobne metody. Kłopot polega jednak na tym, że metody te  
potrzebują kompletu parametrów przekazanych głównej metodzie, a nawet  
czasem dodatkowych informacji przechowywanych w zmiennych głównej metody.  
Gdybym mógł napisać podprocedurę, nie byłoby problemu, ponieważ  
podprocedury (np. w Delphi) mają pełny dostęp do wszystkich zmiennych i  
parametrów procedury czy metody, w której są zagnieżdżone. Wystarczyłoby  
więc przekazać tylko samą parę oraz informację o wspomnianej zmiennej  
wyliczeniowej i problem z głowy.

W C# niestety tak się nie da zrobić. Jeśli chciałbym zagrać zgodnie z  
regułami sztuki, musiałbym napisać dwie "podmetody" z długaśną listą  
parametrów (albo ubrać parametry w osobny obiekt, tyle że IMO powoli  
robiłaby się z tego sztuka dla sztuki). Alternatywą dla nieistniejących  
podmetod mogłoby być ubranie metody wraz z "podmetodami" w klasę i  
przechowywanie parametrów wywołania metody w polach tej klasy. Ale klasę  
taką trzeba byłoby tworzyć dla każdej listy par, a tych może być dużo  
(liczba idzie na pewno w tysiące, jeśli nie więcej, a algorytm jest  
rekurencyjny, więc ponowne używanie instancji klasy raczej odpada).

Jak więc estetycznie rozwiązać ten problem bez użycia podprocedur?

Pozdrawiam -- Spook.

-- 
! ._______. Warning: Lucida Console sig!    //)    !
! || spk ||    www.spook.freshsite.pl      / _ """*!
! ||_____||        spook at op.pl         / '  | ""!
! |  ___  |   tlen: spoko_ws gg:1290136  /. __/"\ '!
! |_|[]_|_|  May the SOURCE be with you! \/)     \ !
Technical Details
Message-ID: <op.vzuv96l08x7o78@notebook>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail
From: "Wojciech \"Spook\" Sura" <spook"mad@hatter"op.pl>
Newsgroups: pl.comp.lang.c
Subject: Podprocedury w C#
Date: Sun, 07 Aug 2011 20:28:44 +0200
Organization: "Portal Gazeta.pl -> http://www.gazeta.pl"
Lines: 136
Message-ID: <op.vzuv96l08x7o78@notebook>
NNTP-Posting-Host: 89-76-139-164.dynamic.chello.pl
Mime-Version: 1.0
X-Trace: inews.gazeta.pl 1312741661 28512 89.76.139.164 (7 Aug 2011 18:27:41 GMT)
X-Complaints-To: usenet@agora.pl
NNTP-Posting-Date: Sun, 7 Aug 2011 18:27:41 +0000 (UTC)
X-User: spoko_ws
User-Agent: Opera Mail/11.50 (Win32)
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit