Gelegentlich sehe ich Code, der dieselbe Funktion hat, die in der if-Anweisung aufgerufen wird, sich jedoch nur in den Argumenten unterscheidet. Überlegen Sie, ob Sie es in der if-Anweisung wirklich aufrufen müssen.
Betrachten Sie ein Beispiel für einen Protokollverwaltungsbildschirm. Detaillierte Protokollinformationen werden dem Systemadministrator angezeigt, detaillierte Protokolle werden jedoch nur dem Systemadministrator angezeigt.
public void Main(bool isManager, string detail)
{
//Zeigen Sie dem Administrator detaillierte Protokolle an.
if (isManager)
{
SetSummary("Ein unerwarteter Fehler ist aufgetreten. Bitte überprüfen Sie das detaillierte Protokoll.");
SetDetail(detail);
}
else
{
SetSummary("Ein unerwarteter Fehler ist aufgetreten.");
SetDetail("Bitte kontaktieren Sie den Administrator für Details.");
}
}
private void SetSummary(string summary)
{
System.Console.WriteLine("Stellen Sie den Umriss auf dem Bildschirm ein." + summary);
}
private void SetDetail(string detail)
{
System.Console.WriteLine("Stellen Sie Details auf dem Bildschirm ein." + detail);
}
public void main(boolean isManager, String detail) {
//Zeigen Sie dem Administrator detaillierte Protokolle an.
if (isManager) {
setSummary("Ein unerwarteter Fehler ist aufgetreten. Bitte überprüfen Sie das detaillierte Protokoll.");
setDetail(detail);
} else {
setSummary("Ein unerwarteter Fehler ist aufgetreten.");
setDetail("Bitte kontaktieren Sie den Administrator für Details.");
}
}
private void setSummary(String summary) {
System.out.println("Stellen Sie den Umriss auf dem Bildschirm ein." + summary);
}
private void setDetail(String detail) {
System.out.println("Stellen Sie Details auf dem Bildschirm ein." + detail);
}
Was in diesem Code besorgniserregend ist, ist, dass der einzige Unterschied in der if-Anweisung darin besteht, dass die Funktionsaufrufe gleich sind, nur die Argumente. Es ist sauberer, nur das Argument zu ändern und einen Funktionsaufruf durchzuführen.
//Zeigen Sie detaillierte Protokolle für Administratoren an.
string summary = null;
string detail = null;
if (isManager)
{
summary = "Ein unerwarteter Fehler ist aufgetreten. Bitte überprüfen Sie das detaillierte Protokoll.";
detail = detailLog;
}
else
{
summary = "Ein unerwarteter Fehler ist aufgetreten.";
detail = "Bitte kontaktieren Sie den Administrator für Details.";
}
//Trennt den Funktionsaufrufteil vom bedingten Zweig.
SetSummary(summary);
SetDetail(detail);
public void main(boolean isManager, String detailLog) {
//Zeigen Sie dem Administrator detaillierte Protokolle an.
String summary = null;
String detail = null;
if (isManager) {
summary = "Ein unerwarteter Fehler ist aufgetreten. Bitte überprüfen Sie das detaillierte Protokoll.";
detail = detailLog;
} else {
summary = "Ein unerwarteter Fehler ist aufgetreten.";
detail = "Bitte kontaktieren Sie den Administrator für Details.";
}
setSummary(summary);
setDetail(detail);
}
private void setSummary(String summary) {
System.out.println("Stellen Sie den Umriss auf dem Bildschirm ein." + summary);
}
private void setDetail(String detail) {
System.out.println("Stellen Sie Details auf dem Bildschirm ein." + detail);
}
In allen Fällen können Funktionsaufrufe nicht getrennt werden, aber ich denke, es gibt Raum für Überlegungen. Was mich mit diesem Fix glücklich macht, ist, dass der Nachrichtengenerierungsprozess und der Nachrichteneinstellungsprozess getrennt werden können. Beispielsweise ist ersichtlich, dass der nachfolgende Nachrichteneinstellungsprozess immer aufgerufen wird, selbst wenn die Nachrichtengenerierung weiter verzweigt und geändert wird, um eine andere Nachricht auszugeben.
Vorheriger Artikel (zu viele Funktionsargumente)
Nächster Artikel (Getter, Setter Reverse Problem)
Recommended Posts