echo $begrüßung;
Man kann jede Schleifenkonstruktion so neu schreiben (refactoring), dass enthaltene Anweisungen wie break und continue überflüssig werden. [...]
Wenn wir schon mal beim Thema sind - da hatte ich neulich das Problem in C# in einem switch ein foreach beenden zu wollen. Das break im switch wirkt aber nur auf selbiges und höchstens ein continue, das im switch nicht vorkommt, hätte auf das foreach gewirkt. Doch ich wollte ja abbrechen und nicht zum nächsten Durchlauf übergehen.
Beim Hinzufügen eines Elements zu this.elements sind diverse Bedingungen (this.Contraints) zu beachten. Jede Bedingung kann ergeben (constraint.Satisfies(...)), dass
- das Element auf jeden Fall hinzugefügt werden darf, egal wie die anderen Antworten ausfallen (Allowed),
- das Element nicht hinzugefügt werden darf (Veto),
- das Element hinzugefügt werden darf (Vote)
- Stimmenthaltung vorliegt (IgnoreMe).
Und zwar in der angegebenen Priorität von oben nach unten.
Der answers.TrueForAll(...)-Aufruf ergibt true wenn kein false-Eintrag enthalten ist, also auch bei leerer Liste. Constraint.Results ist ein enum-Typ mit den oben aufgelistet und in den cases zu sehenden Mitgliedern. Der Rest ist hoffentlich auch ohne C#-Kenntnisse verständlich.
void AddElement(Element element) {
List<bool> answers = new List<bool>();
foreach (Constraint constraint in this.Constraints)
switch (constraint.Satisfies(element, this)) {
case Constraint.Results.Allowed:
answers.Clear(); // discard all other answers
goto Allowed; // and break out of foreach
case Constraint.Results.Veto:
answers.Add(false);
break;
case Constraint.Results.Vote:
answers.Add(true);
break;
case Constraint.Results.IgnoreMe:
break;
default:
throw new NotSupportedException();
}
Allowed:
// either Allowed or at least one constraint has to vote, but nobody must veto.
if (answers.TrueForAll(delegate(bool answer) { return answer; }))
this.elements.Add(element);
else
throw new ArgumentException("Can't add element due to constraint restrictions.");
}
Gibt es andere Lösungsvorschläge und wenn ja, was ist daran besser als bei meiner Implementation?
echo "$verabschiedung $name";