Article View: pl.comp.lang.c
Article #297880Podprocedury w C#
From: Wojciech Spook Sura
Date: Sun, 07 Aug 2011 18:28
Date: Sun, 07 Aug 2011 18:28
71 lines
4020 bytes
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-mailShow 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