Ich schreibe ein Django-Modell, das meiner Website Coupons ermöglicht.
Coupons können drei Arten haben: Lebenszeitgutschein, bestimmter Zeitraum von Monaten Gutschein, bestimmte Anzahl von Dollar Gutschein.
Um die Dinge einfach zu halten, erlaube ich Coupons nur, einen der drei möglichen Werte zu haben (d. h. ein Gutschein kann nicht für 10 und 5 Monate sein). Aber ich möchte überprüfen, wenn ein Gutschein gespeichert wird, um sicherzustellen, dass diese Regel wahr ist.
Momentan habe ich:
%Vor%Ich weiß, es gibt einen besseren Weg, dies zu tun, aber ich sehe es nicht (nenne es den Block des Coders).
Hilfe wird sehr geschätzt.
Für den Fall, dass es sich ergibt, sind die drei Typen int, int und bool
%Vor%Sie können auch eine Liste comp verwenden, um falsche Werte zu filtern:
%Vor%Oder aufbauend auf MRABs Antwort :
%Vor% Behalten Sie die Menge in einem einzelnen Feld bei, und weisen Sie dem Typ ein separates Feld zu, das choices
verwendet.
Ihr Code sieht gut aus. Hier ist warum:
1.) Du hast es geschrieben und du beschreibst die Logik. Sie können alle Arten von syntaktischen Tricks ausführen, um die Codezeilen zu reduzieren (true_count + = 1, wenn self.months sonst 0, riesige if-Anweisung usw.), aber ich denke, die Art, wie Sie sie haben, ist perfekt, weil es das ist, was Sie zuerst tun gedacht beim Versuch, die Logik zu beschreiben.
Lass den niedlichen Code für die Programmier-Herausforderungen, das ist die reale Welt.
2.) Wenn Sie sich jemals entscheiden, dass Sie eine andere Art von Coupon-Werttyp hinzufügen müssen, wissen Sie genau, was Sie tun müssen: Fügen Sie eine weitere if-Anweisung hinzu. In einer komplexen if-Anweisung würde dies zu einer schwierigeren Aufgabe führen.
Bearbeiten:
Ich habe mit einer Karnaugh-Map (http://en.wikipedia.org/wiki/Karnaugh_map) eine schnelle Circuit-Mimization durchgeführt. Es endet, das ist die kleinste mögliche Funktion mit boolescher Logik:
%Vor%Logisch sind beide Aussagen gleichwertig, aber die zweite ist technisch schneller / effizienter.
Edit # 2 : Wenn jemand hier interessiert ist, ist die K-Map
%Vor%Was reduziert auf:
%Vor% Ich denke, es ist in Ordnung, dies über ein paar Zeilen zu verteilen - das macht es leichter zu pflegen, wenn es in Zukunft mehr Attribute zum Testen geben würde. Die Verwendung von len
oder sum
fühlt sich ein wenig zu verschleiert an
Ich weiß nicht, ob das für dich besser ist, aber es würde so funktionieren:
%Vor% Noch bessere Lösung als zuvor, mit combinations
, any
und all
.
Angenommen, Sie haben alle Attribute, die Sie testen möchten, in einer Sequenz namens attributes
:
In Englisch liest es
Sind alle Längen-2-Kombinationen der Attribute wahr?
Diese Lösung funktioniert für eine beliebige Anzahl von Attributen und kann modifiziert werden, um zu testen, ob eine beliebige Anzahl von ihnen wahr ist.
Obwohl es zugegebenermaßen sehr ineffizient ist, würde ich sagen, dass es ziemlich süß und lesbar ist.