71) Czym jest YAGNI?
Zasada YAGNI, czyli You Arent Gonna Need It (nie będziesz tego potrzebował), mówi nam o tym, by nie tworzyć oprogramowania, którego obecnie nie potrzebujemy. Chodzi o to, że jeżeli obecnie nie potrzebujemy danej funkcjonalności, kodu, a uważamy, że możliwe, że kiedyś się przyda, to żeby na razie takiego kodu nie tworzyć. Po prostu nie tworzyć czegoś na wszelki wypadek, bo może się też później okazać to niepotrzebne, nadmiarowe.
Zgodnie z zasadą YAGNI mamy tworzyć kod, dopiero wtedy, gdy będzie naprawdę potrzebny. To samo dotyczy sytuacji, gdy mamy już napisany jakiś kod, ale nie potrzebujemy go. Może to dotyczyć np. sytuacji, gdy klient zrezygnował z danej funkcjonalności. W takim przypadku ten kod powinien zostać usunięty. Nie zakomentowany na wszelki wypadek, ale usunięty. Korzystamy z systemu kontroli wersji i jeżeli w przyszłości będziemy chcieli wrócić do tego kodu, to nie będzie to problem.
72) Czym jest KISS?
Zasada KISS, czyli Keep It Simple Stupid, mówi o tym, żeby nie komplikować sobie niepotrzebnie zadania, czy kodu. Tylko starać się to tworzyć prosto. Jeżeli potrzebujemy stworzyć jakąś prostą aplikację, to nie musimy tam tworzyć jakiejś bardzo zaawansowanej architektury, żeby pokazać, że umiemy taką stworzyć. Jeżeli taka architektura nie będzie tutaj pomocna, to nie ma powodu jej tu stosować. Możemy tylko przez to, niepotrzebnie bardziej skomplikować nasz projekt. Skomplikowany kod ma sporo wad, takich jak gorsza czytelność, większa złożoność, brak zrozumienia.
73) Czym jest DRY?
Zasada DRY, czyli Dont Repeat Yourself (nie powtarzaj się), mówi nam w szczególności o tym, żeby nie powtarzać tego samego kodu w kilku miejscach. Oczywiście, jeżeli to jest możliwe.
Jeżeli mamy w kilku miejscach w naszym projekcie ten sam kod, to w przypadku ewentualnych zmian będziemy musieli wprowadzać wszystkie zmiany we wszystkich miejscach. Warto w takim przypadku wspólny kod wydzielić do osobnej klasy albo skorzystać z dziedziczenia.
Oprócz powtórzeń w kodzie powinniśmy również nie powtarzać innych czynności, które można zautomatyzować np. poprzez napisanie jakichś skryptów, które nam w tym pomogą.
74) Czym jest Singleton?
Singleton jest wzorzec projektowy, który gwarantuje istnienie tylko jednego obiektu danego rodzaju. Powinien również zapewnić możliwość odwołania się do tego obiektu w dowolnym miejscu aplikacji.
Jest to dość kontrowersyjny wzorzec, który ma zarówno sporo zalet, jak i wad.
Jeżeli chodzi o zalety, to mamy pewność, że istnieje tylko jedna instancja danej klasy i mamy do niej dostęp z dowolnego miejsca aplikacji.
Natomiast jeżeli chodzi o wady, to singleton w wielu przypadkach może utrudniać pisanie testów jednostkowych. Przez to, że jest dostępny w całym kodzie aplikacji, może być również nadużywany, a także tworzyć ukryte zależności. Tworzenie takich globalnych obiektów też często utrudnia pisanie kodu.
public class Singleton
{
private static Singleton _instance;
private Singleton()
{
}
public static Singleton Instance
{
get
{
if (_instance == null)
_instance = new Singleton();
return _instance;
}
}
}
75) Wyjaśnij wzorzec MVC
MVC, czyli Model-View-Controller, jest popularnym wzorcem architektonicznym służącym do organizowania struktury aplikacji posiadających graficzne interfejsy użytkownika.
Głównym założeniem tego wzorca jest podzielenie aplikacji na 3 części:
Model, który reprezentuje dane. W nim znajduje się logika aplikacji.
Widok, czyli interfejs użytkownika. Część aplikacji, odpowiedzialna za prezentację danych.
Oraz kontroler, który steruje aplikacją i komunikuje się z użytkownikiem. Przyjmuje dane od użytkownika, wywołuje odpowiednie akcje, które najpierw aktualizują model i później odświeżają widoki.
W C# w szczególności używamy wzorca MVC, tworząc aplikację w ASP.NET, czy ASP.NET Core.
76) Wyjaśnij wzorzec MVVM
MVVM, czyli Model-View-ViewModel, jest również wzorcem architektonicznym, który służy do organizowania struktury aplikacji posiadających GUI. W C# możesz tego wzorca użyć przede wszystkim w aplikacji WPF oraz Xamarin.
Dzieli aplikację na 3 części:
Model, który reprezentuje dane. W nim znajduje się logika aplikacji.
Widok, czyli interfejs użytkownika. Ta warstwa jest odpowiedzialna za interakcje z użytkownikiem. W WPF warstwa widoku jest tworzona w XAML.
ViewModel, który umożliwia nam powiązanie danych widoku z modelem. Można powiedzieć, że łączy widok z modelem. Jego zadaniem jest udostępnianie danych dla widoku oraz wymianę informacji z modelem. Warto tutaj wspomnieć, że ViewModel ze wzorca MVVM jest czymś zupełnie innym niż ViewModel w MVC.
77) Co to jest Dependency Injection?
Dependency injection, czyli wstrzykiwanie zależności, jest to wzorzec polegający na usuwaniu bezpośrednich zależności w kodzie.
Dzięki niemu możemy uzyskać tzw. luźne powiązania, do czego powinniśmy dążyć, pisząc aplikacje. Chcemy, aby nasze aplikacje były bardziej elastyczne, a ewentualne zmiany w przyszłości były jak najłatwiejsze do wprowadzenia, oraz co bardzo ważne dążymy do tego, aby nasza aplikacja była testowalna, to znaczy, żeby w łatwy sposób dało się do niej napisać testy jednostkowe. Aby to zrobić, to przede wszystkim musimy opierać nasze rozwiązanie, nie na konkretnych implementacjach, ale na interfejsach. Co sprawia, że mamy w kodzie małe zależności. Interfejsy są stabilne. To znaczy, jeżeli zrobimy jakąś zmianę w interfejsie, to ta zmiana jest powiązana również, ze zmianą w implementacjach tego interfejsu. Jeżeli jednak zrobimy zmianę w konkretnej implementacji, to zazwyczaj nie potrzebujemy zmieniać naszego interfejsu. Co za tym idzie, interfejsy są stabilniejsze od implementacji.
Także pierwszym krokiem do stosowania dependency injection jest stworzenie abstrakcji dla klas, np. poprzez stworzenie interfejsów, a następnie operowania w aplikacji nie na konkretnych implementacjach, ale właśnie na tych interfejsach. Konkretne implementacje zostaną właśnie dzięki dependency injection wstrzyknięte do naszej aplikacji. Możemy w jednym miejscu powiedzieć, że chcemy, żeby we wszystkich miejscach, gdzie używamy danego interfejsu, została wstrzyknięta konkretna implementacja.
78) Jakie ma zastosowanie słowo kluczowe yield w C#?
Słowa kluczowe yield możemy użyć wewnątrz metody, która jest iteratorem. Działa tak, że jeżeli iterujemy się po danej kolekcji wewnątrz metody, to w każdej iteracji za pomocą yield od razu jest zwracany dany element. Oznacza to, że kod metody, w której użyto słowa kluczowego yield, wykonuje się podczas iteracji zwracanej kolekcji, a nie jak standardowo podczas wywołania metody.
Dodatkowo używając yield, nie musimy też tworzyć nowej instancji kolekcji, która służy nam tylko do przechowywania elementów do zwrócenia z metody.
public static IEnumerable<int> Power(int number, int exponent)
{
int result = 1;
for (int i = 0; i < exponent; i++)
{
result = result * number;
yield return result;
}
}
79) Czym są delegaty w C#?
Delegaty są porównywane do wskaźników funkcji w języku C++, są jednak bardziej bezpieczne i mają większe możliwości.
Delegaty przechowują referencję do metody lub nawet grupy metod. Nie posiadają ciała, a jedynie sygnaturę. Sygnatura musi określać parametry delegatu i typ zwrotny. Aby utworzyć definicję delegata, używamy do tego słowa kluczowego delegate.
Delegaty mogą być przede wszystkim pomocne w sytuacji, gdy chcemy przekazać metody jako parametr do innych metod. Istnieją takie przypadki, w których masz metodę, która coś robi i wywołuje inną metodę. W czasie kompilacji nie wiesz, czym jest ta druga metoda, ponieważ te informacje są dostępne tylko w czasie wykonywania programy i tutaj właśnie pomogą delegaty.
Mamy kilka gotowych delegatów, z których możemy korzystać, są to między innymi Func, Action, Predicate.
public delegate int GetSum(int number1, int number2);
public delegate TResult Func<out Tresult>();
public delegate void Action();
static void Main(string[] args)
{
Log(Run);
}
public static void Run()
{
Console.WriteLine("Run method");
}
public static void Log(Action action)
{
//log
action.Invoke();
//log
}
80) Czym są zdarzenia w C#?
Zdarzenie jest to akcja użytkownika, która generuje powiadomienie do aplikacji. Akcja użytkownika może być dowolna np. kliknięcie w przycisk, scrollowanie itd.
Klasa, która zgłasza dane zdarzenie, nazywa się publisher (wydawca), a klasa, która to zdarzenie odbiera, nazywa się subscriber (subskrybent). Aby zdarzenie zostało zgłoszone, musi mieć przynajmniej jednego subskrybenta.
Ze zdarzeniami mamy wiele do czynienia w aplikacjach windows forms, gdzie możemy zasubskrybować różne zdarzenia na formularzu, takie jak: kliknięcie myszy, najechanie myszy, zmiana tekstu, zmiana wartości, załadowanie okna, zamknięcie okna itd. Sami oczywiście również możemy tworzyć własne zdarzenia. Mogą być przydane w sytuacji, gdy o danym zachowaniu, chcemy poinformować inne obiekty.
public event Action<object, EventArgs> ButtonClicked;
protected virtual void OnButtonClicked(EventArgs args)
{
ButtonClicked?.Invoke(this, args);
}
ZAKOŃCZENIE
To tyle pytań w tym artykule. Kolejne przeanalizujemy już w kolejnym artykule. Jeżeli taki materiał Ci się spodobał, to koniecznie dołącz do mojej społeczności – darmowe zapisy, gdzie będziesz również miał dostęp do dodatkowych materiałów.
To wszystko na dzisiaj, do zobaczenia w kolejnym artykule.
Poprzedni artykuł - 100 Pytań (i Odpowiedzi!) z Rozmów Kwalifikacyjnych Dla Młodszych Programistów C#/.NET (Część 7/10).
Następny artykuł - 100 Pytań (i Odpowiedzi!) z Rozmów Kwalifikacyjnych Dla Młodszych Programistów C#/.NET (Część 9/10).