Pozwolę sobie powiedzieć, że nie jest to mój kod ani kod moich współpracowników. Wiele lat temu, kiedy nasza firma była mniejsza, mieliśmy pewne projekty, które musieliśmy wykonać, do których nie mieliśmy możliwości, więc zostały zlecone na zewnątrz. Teraz nie mam nic przeciwko outsourcingowi ani ogólnie wykonawcom, ale baza kodów, którą stworzyli, to masa WTF. To powiedziawszy, działa (głównie), więc przypuszczam, że znajduje się w 10% najlepszych projektów outsourcingowych, jakie widziałem.
W miarę rozwoju naszej firmy staraliśmy się więcej rozwijać. Ten konkretny projekt wylądował mi na kolanach, więc go omijałem, sprzątałem, dodawałem testy itp.
Jest jeden wzór, który często powtarzam i wydaje się tak niesamowicie okropny, że zastanawiałem się, czy może jest jakiś powód i po prostu go nie widzę. Wzorzec jest obiektem bez publicznych metod lub elementów, tylko publicznym konstruktorem, który wykonuje całą pracę na obiekcie.
Na przykład (jeśli kod ma znaczenie w Javie, ale mam nadzieję, że będzie to bardziej ogólne pytanie):
public class Foo {
private int bar;
private String baz;
public Foo(File f) {
execute(f);
}
private void execute(File f) {
// FTP the file to some hardcoded location,
// or parse the file and commit to the database, or whatever
}
}
Jeśli zastanawiasz się, ten typ kodu jest często wywoływany w następujący sposób:
for(File f : someListOfFiles) {
new Foo(f);
}
Teraz nauczono mnie dawno temu, że instancyjne obiekty w pętli są ogólnie złym pomysłem i że konstruktorzy powinni wykonać minimum pracy. Patrząc na ten kod, wygląda na to, że lepiej byłoby porzucić konstruktor i zrobić execute
publiczną metodę statyczną.
Zapytałem wykonawcę, dlaczego zostało to zrobione w ten sposób, a otrzymałem odpowiedź: „Możemy to zmienić, jeśli chcesz”. Co nie było tak naprawdę pomocne.
W każdym razie, czy jest jakiś powód, aby zrobić coś takiego w jakimkolwiek języku programowania, czy to tylko kolejne zgłoszenie do Daily WTF?
public static void main(string[] args)
obiektach i słyszeli o nich, a następnie próbowali je złączyć.