Jeśli chodzi o Twoje pierwsze pytanie, to zauważyłem że masz dużo razy
DonatorList.Add(Donator);
więc całą tą metodę rozbiłem na dwie:
- Jedna która iteruje po liście i dodaje do innej
- Druga która sprawdza czy element powinien być dodany do listy.
Kroki które przedsięwziąłem, są co następuje:
- Przeniosłem te ify do innej metody która tylko mówi "Dodaj albo nie dodaj" (czyli
return true/false
), a już ta pierwsza zajmuje się dodawaniem
- Skoro korzystam z returna, to i tak wyjdę z funkcji czyli else'y są nie potrzebne
- Wyciągnąłem te porównania do zmiennych żeby kod był chociaż trochę bardziej czytelny
public static List<Donator> GetDonator(string Name, string Town, string PhoneNumber)
{
List<Donator> DonatorList = new List<Donator>();
using (var context = new DonatorContext())
{
foreach (var Donator in context.Donators)
{
if (shouldDonatorBeAdded(Name,Town,PhoneNumber,Donator))
{
DonatorList.Add(Donator);
}
}
}
return DonatorList;
}
private static shouldDonatorBeAdded(string Name, string Town, string PhoneNumber, Donator Donator)
{
bool TownIsNotEmpty = Town != "";
bool PhoneNumberIsNotEmpty = PhoneNumber != "___-___-___";
bool NameIsNotEmpty = Name != "";
bool TownIsEmpty = Town == "";
bool PhoneNumberIsEmpty = PhoneNumber == "___-___-___";
bool NameIsEmpty = Name == "";
if (NameIsNotEmpty && TownIsNotEmpty && PhoneNumberIsNotEmpty)
{
return (Donator.Name == Name && Donator.Town == Town && Donator.PhoneNumber == PhoneNumber);
}
if (NameIsNotEmpty && TownIsNotEmpty && PhoneNumberIsEmpty)
{
return (Donator.Name == Name && Donator.Town == Town)
}
if (NameIsNotEmpty && TownIsEmpty && PhoneNumberIsNotEmpty)
{
return (Donator.Name == Name && Donator.PhoneNumber == PhoneNumber);
}
if (NameIsEmpty && TownIsNotEmpty && PhoneNumberIsEmpty)
{
return (Donator.PhoneNumber == PhoneNumber && Donator.Town == Town);
}
if (NameIsEmpty && TownIsEmpty && PhoneNumberIsNotEmpty)
{
return (Donator.PhoneNumber == PhoneNumber);
}
if (NameIsNotEmpty && TownIsEmpty && PhoneNumberIsEmpty)
{
return (Donator.Name == Name);
}
if (NameIsEmpty && TownIsEmpty && PhoneNumberIsEmpty)
{
return (Donator.Town == Town);
}
return false;
}
Żeby kod był bardziej przejżysty możesz zrobić to:
Rozbijasz środek każdego ifa do innej metody i nazywasz je np (kolejno)
-
AllFieldsFilled()
-
OnlyPhoneEmpty()
-
OnlyTownEmpty()
-
OnlyNameEmpty()
-
NameAndTownEmpty()
-
NameAndPhoneEmpty()
i tak dalej
te porównania Donator.Name==Name && Donator.Town == Town
zamieniłbym na
-
TownMatch() && NameMatch()
albo coś takiego
metody te można trzymać w tej klasie bo jest mała albo dodać do innej dla przejżystości.
Teraz jeżeli koniecznie chcesz się pozbyć ifów to masz dwie opcje (łatwiejsza i trudniejsza)
Pierwsza:
-
Robisz sobie zmienną (Twoje metody są statyczne więc zmienna niestety też będzie musiała być statyczna (źle! nie rób tak nigdy :D)) która nazywa się bool shouldAddDonator = false
.
-
Każdego z Twoich 7dmiu ifów zamieniasz w taki sposób
if (NameIsNotEmpty && TownIsNotEmpty && PhoneNumberIsNotEmpty)
{
return (Donator.Name == Name && Donator.Town == Town && Donator.PhoneNumber == PhoneNumber);
}
na
shouldAddIfAllFieldsAreNotEmpty();
// ...
private void shouldAddIfAllFieldsAreNotEmpty()
{
// tutaj Twój if
if (NameIsNotEmpty && TownIsNotEmpty && PhoneNumberIsNotEmpty)
{
shouldAddDonator = true;
}
}
i tak z każdym ifem, teraz Twoich 7 brzydkich ifów jest 7dmioma wywołaniami metody.
Kiedy już to zrobisz możesz to zrobić ładniej i tych 7 metod oraz 7 ifów oraz zmienna 'shouldAddDonator' przenieść do innej klasy i wtedy już w ogóle będzie pięknie (nie ma statycznej zmiennej). Twój DonatorDatabase nagle skraca się do jednej pętli.
Druga:
Jeżeli jednak chciałbyś zrobić żeby ta klasa była w miarę elastyczna i żeby dodanie nowego pola lub warunku było w miarę proste to mógłbyś JESZCZE DO TEGO użyć polimorfizmu (jeżeli się podejmiesz i masz wrażenie że dasz radę i nie będzie to dla Ciebie skomplikowane). Jeżeli Cię to interesuje to skomentuj i wtedy opiszę dokładniej
Wiem że te porównania można by zamienić na czadowe lambdy i linq albo przeniesienie sprawdzania do bazy danych, ale zrobiłem to tak jakbym ja to zrobił bez korzystania ze specyfiki języka. Dziękuję.