Dlatego tworzę metodę tworzenia linii powitania opartej na dwóch osobach z bazy danych.
Istnieją cztery parametry: dwie nazwy ( name1
i name2
) oraz dwie płcie ( gender
i gender2
).
Dla każdej kombinacji płci mam coś innego.
Na przykład: jeśli płeć 1 to M
(mężczyzna) i płeć 2 również M
, wynik powinien wyglądać następująco:
Dear Sir name1 and Sir name2,
W tej chwili mój przełącznik wygląda następująco:
switch(gender1){
case 'M':
switch(gender2){
case 'M': printf("Dear Sir %s and Sir %s", name1, name2); break;
case 'W': printf("Dear Sir %s and Madame %s", name1, name2); break;
case 'R': ...
}
break;
case 'W':
switch(gender2){
case 'M': printf("Dear Madame %s and Sir %s", name1, name2); break
case 'W': printf("Dear Madame %s and Madame %s", name1, name2); break;
case 'R': ...
}
break;
case ...etc.
}
Zauważ, że mam wiele opcji związanych z płcią, jak 'R'
dla "Dear Relation"
a niektóre bardziej, że nie mają czasu na tłumaczenie.
Jak mogę zmniejszyć tę instrukcję podwójnego przełączania?
Umieszczenie drugiego przełącznika w metodzie nie jest opcją, ponieważ istnieje również przypadek, w którym obie nazwy są takie same, a następnie dane wyjściowe należy połączyć w następujący sposób: "Dear Sir and Madame name1,"
gender1+gender2
.Madam
nie jestMadame
.Madame
jest francuską formą.Odpowiedzi:
Dodaj tytuł do parametrów printf:
przełącznik można wyodrębnić do własnej funkcji w celu ponownego użycia i zwartości.
źródło
genderToTitle
, abyś nie musiał jej powtarzać? (Lub użyj pętli)Radykalne rozwiązanie: pozwól użytkownikowi określić własny tytuł (ze wstępnie zdefiniowanej listy, którą podajesz).
Twoje rozwiązanie (patrząc z angielskich oczu) wydaje się służyć wyłącznie Lordom („Sir”) i kobietom; większość mężczyzn byłaby nazywana „panem”, większość kobiet to „panna”, „pani” lub „pani”, w zależności od ich stanu cywilnego i osobistych opinii. Potem jest cała masa innych wyróżnień opartych na zawodowych rankingach - „Lekarze”, „Profesorowie”, „Wielebni”, a nawet, jeśli czujecie się bardzo optymistycznie na temat swojej witryny, „Świętość”!
Prostsze rozwiązanie: potrzebujesz [pojedynczej] funkcji, aby przetłumaczyć „płeć” na honorową. Wpisz go raz i zadzwoń do obu osób:
źródło
Dear Sir
jako forma adresu jest całkowicie akceptowalna dla wszystkich mężczyzn. Zgadzam się, że jako tytuł Sir (jak w in.Sir Phill
) Powinien być ograniczony do rycerzy (nie panów), ale to inna sprawa.Tytuły naprawdę należą do bazy danych, ale stwierdziłeś, że nie masz nad tym kontroli. Nie określono znacznika języka, ale jego składnia należy do rodziny C, więc będzie to pseudokod, który ma prawie C ++:
Zaletą tego jest zakopanie logiki wyboru w strukturze danych zamiast w strukturze kodu: jest to podobne do delegowania do bazy danych i jest bardziej elastyczne. Jeśli trzymasz tę mapę gdzieś jako stałą statyczną, możesz prawie użyć jej jak bazy danych: staje się ona pojedynczą strukturą do aktualizacji, z której można korzystać w wielu miejscach w kodzie bez potrzeby pisania więcej kodu.
źródło
static const
:static const map<string, string> titles{make_pair("M", "Sir"), make_pair("F", "Madam")};
. Cóż, można pominąćconst
, jeśli modyfikacja powinna być dozwolona.Odpowiedź zapadkowy Freak jest to całkiem dobry pomysł, jeśli zdania są wszyscy ten sam wzór, lecz z dwoma wypustkami, po jednym zależy tylko od
gender1
odpowiedniegogender2
.Odpowiedź Phila W. jest prawdopodobnie najbardziej elastyczną odpowiedzią, ponieważ umożliwia wyraźną kontrolę nad powitaniem, choć jest całkiem poprawny, to radykalna zmiana. Być może nie masz danych w tej formie.
Odpowiedź Kiliana Fotha jest prawdopodobnie najlepsza na zadane pytanie, choć zależy on od włączenia łańcucha, co może być niemożliwe lub przynajmniej droższe.
Udoskonalenie odpowiedzi Kiliana polega na obliczeniu jednej wartości z obu danych wejściowych i włączeniu:
Oczywiście, ponieważ otrzymujesz wszystkie cztery dane wejściowe (2 nazwiska i 2 płcie) z bazy danych, dodanie kolejnej tabeli i dołączenie do niej w celu uzyskania odpowiedniego powitania jest prawdopodobnie bardziej elastyczne i może łatwiejsze niż powyższe.
źródło
Jeśli twój język to pozwala, możesz pisać
Niekoniecznie jest lepsza niż twoja wersja, ponieważ nadal występuje powielanie, ale pozwala uniknąć zagnieżdżenia
switch
.źródło
Zazwyczaj chciałbyś, aby ciągi interfejsu użytkownika takie jak ten były pobierane z tabeli ciągów zamiast na stałe zakodowane w kodzie źródłowym, w celu lokalizacji i łatwości aktualizacji. Podejście, które wybrałbym, to wykorzystanie danych wejściowych do zbudowania klucza odnośnika, więc coś w stylu:
Inne sugestie dotyczące pozwalania użytkownikom wybierać własne tytuły są ważne, jeśli masz możliwość uzyskania tych informacji. Nadal używałbym wyszukiwania tabeli ciągów w rozwiązaniu.
źródło