Delegowanie

Prędzej czy później przyjdzie taki moment kiedy pojęcie delegowania zadań stanie naprzeciw nam. Dobry manager nie boi się rozdzielania obowiązków, a jak radzi sobie z tym programista C#?

W programowaniu tak jak w życiu możemy delegować zadania innym, a konkretniej mówiąc:

Tworzyć delegacyjne typy referencyjne i przypisywać do nich metody (jedną bądź wiele).

Nie owijając dłużej w bawełnę przejdź do przykładu który skutecznie przybliża nam to odległe zagadnienie.

class PodstawyDelegatow
{
    //typ Transformer jest zgodny z każdą metodą o typie zwrotnym int i przyjmującą 1 parametr typu int
    delegate int Transformer(int x);
        
    public static int Square(int x) => x * x;

    //przykladowe użycie

    //utworzenie egzamplarzu delegatu: przypisanie metody 'Squrare' do zmiennej typu delegujacyjnego 't'
    Transformer t = Square; //skrócona forma zapisu Transofrmer t = new Transformer(Square)

    //egzamplarz delegacyjny wywołujemy jak każdą metodę
    public void Test()
    {
        int result = t(3); //skrócona forma zapisu t.Invoke(3)
        Console.WriteLine(result); //9
    }
}

Tak w wielkim uproszczeniu wyglądają delegaty, zadajmy sobie jednak pytanie co ciekawego możemy z nimi jeszcze zrobić?

Metody plug-in

To przykład wykorzystania delegatów, gdzie zmienne delegacyjne będą przypisywane w czasie działania programu. Polega to na utworzeniu metody przyjmujących jako parametry delegaty. W efekcie czego, możliwe jest podpinanie do ww. metod innych metod.

public delegate int Transformer(int x);

public class PlugInExample
{
    public static void Transform(int[] values, Transformer t) //t - parametr delegacyjny w metodzie będący plug-in'em przekształacającym
    {
        for (int i = 0; i < values.Length; i++) 
        {
             values[i] = t(values[i]); 
        } 
    } 
} 

//Jak możemy tego użyć? 

public class PlugInTest 
{ 
    public static int Double(int x) =&gt;; 2*x;

    public static void Test()
    {
        int[] values = { 3, 6, 9 };

        PlugInExample.Transform(values, Double);
        foreach (int item in values)
        {
            Console.WriteLine(item); //6 12 18
        }
    }
}

Metoda Transform to funkcja wyższego rzędu pobierająca jako argument inną funkcję – równie dobrze w miejscu Double, moglibyśmy wcisnąć Square, Triple itd.

Ostatnią rzeczą o której dziś wspomnę w temacie delegatów jest…

Multicast

Tak jak wspomniałem na początku wpisu delegaty nie muszą odnosić się do jednej metody – może to być całą lista metod, które będą wykonywać (w kolejności dodania). Jeśli chciałbyś poczuć się w swojej szarej codzienności jak delegat, wykonuj taski przydzielone od managera w kolejności ich otrzymania.

Do łączenia delegatów używamy znaków + oraz +=, możemy również korzystać z jak i -=.

  • Operatora + oraz += można używać ze zmiennymi delegacyjnymi o wartości null.
  • Użycie operatora -= na zmiennej delegacyjnej z jedną metodą będzie równoznacznie z przypisaniem wartości null do delegatu.

Przybliżmy sobie to przykładem.

public delegate void MulicastDelegate(int percent);

public class MulticastDelegateExample
{
    public static void ProcessJob(MulicastDelegate m)
    {
        for(int i = 0; i&lt;10; i++) 
        {
             m(i); 
        } 
    } 
} 
public class MulticastDelegateTest 
{
     public void MulticastTest() 
     { 
          MulicastDelegate mulicastDelegate = WriteToConsole; 
          mulicastDelegate += WriteToFile; 
          MulticastDelegateExample.ProcessJob(mulicastDelegate); 
     } 

     public static void WriteToConsole(int value) => Console.WriteLine(value);
     public static void WriteToFile(int value) => System.IO.File.WriteAllText("MulticastDelegate.txt", value.ToString());
}

Podsumowanie

Delegowanie zadań nie zwalnia Cię z odpowiedzialności, nie może być powodem zrzucania winy na innych. Tak jak w życiu, tak i w kodowaniu pomimo zawiłości związanych z użyciem delegatów pamiętaj, że to odpowiedzialność spoczywa na Twoich barkach, za ewentualnie niepowodzenia nie należy obwiniać niczemu niwinnych delegatów.

 

Jeśli poszukujesz większej ilości ciekawych treści na pewno zainteresują Cię inne wpisy, które umieściłem na blogu. Zapraszam do pozostawienia komentarzy, czekam na Twoją opinię, uwagi i feedback.

Pozdrawiam Cię serdecznie i życzę fantastycznego dnia!
Wojtek