Also mache ich eine Methode, um eine Anrede zu erstellen, die auf zwei Personen aus einer Datenbank basiert.
Es gibt vier Parameter: die beiden Namen ( name1
und name2
) und die beiden Geschlechter ( gender
und gender2
).
Für jede Geschlechtskombination habe ich eine andere Ausgabe.
Zum Beispiel: Wenn Geschlecht 1 M
(Mann) und Geschlecht 2 auch ist M
, sollte die Ausgabe ungefähr so aussehen:
Dear Sir name1 and Sir name2,
Zu diesem Zeitpunkt sieht mein Schalter folgendermaßen aus:
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.
}
Beachten Sie, dass ich mehrere Geschlechtsoptionen habe, z. B. 'R'
für "Dear Relation"
und einige andere, für deren Übersetzung ich keine Zeit habe.
Wie kann ich diese Double-Switch-Anweisung reduzieren?
Das Einfügen des zweiten Schalters in eine Methode ist keine Option, da es auch einen Fall gibt, in dem beide Namen gleich sind und die Ausgabe dann wie folgt kombiniert werden sollte: "Dear Sir and Madame name1,"
gender1+gender2
.Madam
nichtMadame
.Madame
ist die französische Form.Antworten:
Fügen Sie den Parametern des Drucks den Titel hinzu:
Sie können den Switch für Wiederverwendbarkeit und Kompaktheit in eine eigene Funktion extrahieren.
quelle
genderToTitle
damit Sie es nicht wiederholen müssen? (Oder verwenden Sie eine Schleife)Radikale Lösung: Lassen Sie den Benutzer seinen eigenen Titel angeben (aus einer von Ihnen angegebenen vordefinierten Liste).
Ihre Lösung (aus englischer Sicht) scheint nur für Lords ("Sir") und Damen zu sorgen. Die meisten Männer würden je nach Familienstand und persönlicher Meinung als "Herr", die meisten Frauen als "Fräulein", "Frau" oder "Frau" angesprochen. Dann gibt es eine ganze Reihe weiterer Ehrungen, die auf der professionellen Rangliste basieren - "Ärzte", "Professoren", "Reverends" und sogar "Heiligkeit" , wenn Sie wirklich optimistisch in Bezug auf Ihre Website sind!
Einfachere Lösung: Sie benötigen eine [einzelne] Funktion, um "Geschlecht" in eine Ehrung zu übersetzen. Codieren Sie es einmal und nennen Sie es für beide Personen:
quelle
Dear Sir
als Anrede ist für alle Männer durchaus akzeptabel. Ich stimme zu, dass Sir (wie in ) als TitelSir Phill
auf Ritter (nicht Lords) beschränkt sein sollte, aber das ist eine andere Sache.Titel gehören wirklich in die Datenbank, aber Sie haben angegeben, dass Sie keine Kontrolle darüber haben. Sie haben kein Sprach-Tag angegeben, aber die Syntax gehört zur C-Familie. Dies ist also ein Pseudocode, der fast C ++ ist:
Dies hat den Vorteil, dass Sie die Auswahllogik in einer Datenstruktur und nicht in einer Codestruktur vergraben: Dies ähnelt der Delegierung an die Datenbank und ist flexibler. Wenn Sie diese Karte als eine statische Konstante irgendwo halten, können Sie fast wie ein Datenbank verwenden: es wird eine einzige Struktur zu aktualisieren , die , ohne dass an vielen Stellen im Code verwendet werden können , um schreibt mehr Code.
quelle
static const
:static const map<string, string> titles{make_pair("M", "Sir"), make_pair("F", "Madam")};
. Nun, man kann das weglassenconst
, wenn das Ändern erlaubt sein sollte.Die Antwort des Ratschenfreaks ist eine gute Idee, wenn die Sätze alle das gleiche Muster haben, aber mit zwei Einfügungen, von denen jeweils nur eine von der
gender1
jeweiligen abhängig istgender2
.Die Antwort von Phil W. ist wahrscheinlich die flexibelste, da sie eine explizite Kontrolle über die Begrüßung ermöglicht, obwohl er ganz richtig ist, dass es sich um eine radikale Änderung handelt. Möglicherweise verfügen Sie nicht über die Daten in dieser Form.
Kilian Foths Antwort ist wahrscheinlich die beste für die gestellte Frage, obwohl er darauf angewiesen ist, eine Saite einzuschalten, was möglicherweise nicht möglich oder zumindest wahrscheinlich teurer ist.
Eine Verfeinerung von Kilians Antwort besteht darin, einen einzelnen Wert aus beiden Eingaben zu berechnen und diesen einzuschalten:
Da Sie alle vier Eingaben (2 Namen und 2 Geschlechter) aus einer Datenbank erhalten, ist das Hinzufügen einer weiteren Tabelle und das Zusammenfügen dieser Tabellen zur Erzielung der richtigen Anrede wahrscheinlich flexibler und möglicherweise einfacher als die oben genannten.
quelle
Wenn Ihre Sprache es Ihnen erlaubt, können Sie schreiben
Es ist nicht unbedingt besser als Ihre Version, da es immer noch Duplikate gibt, aber es vermeidet die verschachtelten
switch
.quelle
Normalerweise möchten Sie, dass UI-Zeichenfolgen wie diese aus einer Zeichenfolgentabelle abgerufen werden, anstatt im Quellcode fest codiert zu sein, um sie zu lokalisieren und die Aktualisierung zu vereinfachen. Der Ansatz, den ich wählen würde, wäre, die Eingaben zu verwenden, um einen Suchschlüssel zu erstellen, also so etwas wie:
Die anderen Vorschläge, wie Benutzer ihre eigenen Titel auswählen können, sind gültig, wenn Sie die Möglichkeit haben, diese Informationen abzurufen. Ich würde immer noch eine String-Tabellensuche in der Lösung verwenden.
quelle