Singleton jest lepszy niż metody i zmienne statyczne pomimo tego, że mi się nie podoba. Metody i zmienne statyczne w takim przypadku jak Twój to najgorsze co może być i szlag mnie wręcz trafia jak coś podobnego widzę. Jak napiszesz testy jednostkowe dla Twojej klasy w takiej postaci? Jakoś napiszesz, ale będą to testy złej jakości.
Statyczne funkcje działające na bazie danych zmieniają status działania na tej bazie, przez co testy jednostkowe są niewiarygodne, a działanie programu nieprzewidywalne, bo nigdy nie wiadomo, czy przypadkiem stan jakiejś zmiennej nie został zmienione w niewiadomym miejscu aplikacji.
Z tego też powodu powinno się pisać tym podobne klasy w pełni obiektowo lub przynajmniej zastosować ten pieprzony singleton.
Kiedyś też słyszałem o wstrzykiwaniu zależności w takim przypadku, ale nie wiem czy dobrze kojarzę i nie stosowałem w praktyce.
u Ciebie to cudo:
public static MySqlConnection connection;
może być zmodyfikowane w każdej chwili przez każdą rzecz w programie. W jaki sposób, chcesz więc zapewnić bezpieczeństwo i niezawodność?
Nie dasz rady po prostu bo to nie możliwe w tak napisanym kodzie.
Ta funkcja to też perełka:
public static bool Connect()
{
try
{
connection = new MySqlConnection();
connection.ConnectionString = "database=" + database + "; server=" + server + "; user id=" + user + "; Password=" + password;
connection.Open();
return true;
}
catch
{
return false;
}
}
Na wejściu tworzysz nowy obiekt, a Twoja klasa właśnie jest do kitu, bo być może już taki obiekt masz. W ten sposób wywołanie w pętli funkcji Vonnect będzie w kółko tworzyć obiekty i łączyć się do bazy.
Dlaczego tak zrobiłeś? Z prostego powodu - bo nie mogłeś sprawdzić stanu połączenie, gdy był null. Wymagało to zbyt wielu rozgałęzień w kodzie, więc postawiłeś na wersję prostą, ale... bezsensowną własnie z powodu statyczności.
Funkcje statyczne powinny być stosowane tylko wtedy, gdy nie korzystają z atrybutów danej klasy. Np funkcja:
int Math.Add(int x, int y)