webForumDet fria alternativet

Anti-IF kod i C# ??

.NETur .NET

10 svar · 660 visningar · startad av lilja

Medlem sedan juli 20041 183 inlägg
Frågan#1

http://www.antiifcampaign.com/

Någon här som som sett och hakat på detta?

På sidan skrivs följande kod

                // Bond class
                double calculateValue() {
                       if(_type == BTP)  { 
                        return calculateBTPValue();
                       } else if(_type == BOT) { 
                                 return calculateBOTValue();    
                              } else {
                                 return calculateEUBValue();
                              }
                }

om till

                 // Bond class
                double calculateValue() {
                    _bondProfile.calculate();
                }
                // AbstractBondProfile class
                abstract double calculate();
                
                // classe BTPBondProfile >> AbstractBondProfile
                double calculate() {
                    ...
                }
                // classe BOTBondProfile >> AbstractBondProfile
                double calculate() {
                    ...
                }
                // classe EUBondProfile >> AbstractBondProfile
                double calculate() {
                    ...
                }

Hur skulle det se ut i C#? Jag förstår inte riktigt hur man vet vilken abstrakt klass som kommer köras?

Medlem sedan mars 20007 896 inlägg
#2

Det är ju det som är hela grejen, den abstrakta klassen gör ju ingen implementation av calculate() - utan det gör sub-klasserna.

class AbstractBondProfile {
    double calculate();
}
class BOTBondProfile : AbstractBondProfile {
    private double value;
    ...
    double calculate() {
        return (this.value * 2);
    }
}
class BTPBondProfile : AbstractBondProfile {
    private double value;
    ...
    double calculate() {
        return (this.value * 3);
    }
}

Typ?

Medlem sedan juli 20041 183 inlägg
#3

Jag behöver antagligen läsa på lite om abstrakta klasser men när väljer man kalssen BOTBondProfile eller BTPBondProfile?

Medlem sedan aug. 20003 575 inlägg
#4

Nästlade if-satser är oftast bevis på dålig design :) (gör koden svårare att följa).
Vilket den abstrakta löser fint i detta fallet :D.

Medlem sedan juli 20041 183 inlägg
#5

Jo jag har förstått det och det är därför jag försöker förstå hur man skall skriva istället. Vilket är därför jag frågade och jag förstår fortfarande inte :P

Ska man ha helt separerade klasser istället för if-satser? Hur vet jag då vilken klass jag skall anropa om jag inte använder IF-satser??

Medlem sedan aug. 20003 575 inlägg
#6

Jo istället för att ha medlemmarna:
Type
Calculate()

Så säger ju klassnamnet dig vilken typ klassen representerar samt vilken uträkning som skall utföras.

Jag tycker detta är extremt användbart för att få bort tusenraders koder med if else if osv.
Jag anser att det är bättre att ha flera klasser med mindre kodrader i än färre klasser med fler kodrader.
Jag vill snabbt kunna ta fram koden som jag vill arbeta med och då tycker jag det är smidigt att ha en första uppdelning i klasser.

Medlem sedan mars 20007 896 inlägg
#7

lilja skrev:

Jo jag har förstått det och det är därför jag försöker förstå hur man skall skriva istället. Vilket är därför jag frågade och jag förstår fortfarande inte :P

Ska man ha helt separerade klasser istället för if-satser? Hur vet jag då vilken klass jag skall anropa om jag inte använder IF-satser??

Du kan antagligen inte få bort _alla_ if-satser - men genom att refaktorera och omstrukturera kan "onödiga" if-satser, som i ditt exempel, plockas bort.

Du behöver inte veta vilken klass du ska anropa, alla anrop görs genom den abstrakta klassen.

public static void Main() {
    ...
    AbstractBondProfile abf = otherClass.getBondInstance();
    // Eller: AbstractBondProfile abf = new BOTBondProfile();
    // Eller: AbstractBondProfile abf = new BTPBondProfile();
    abf.calculate();
}

Som du ser kommer instansen vara av den abstrakta klassen, men referensen går till en implementation av den abstrakta klassen (BOTBondProfile/BTPBondProfile).

Medlem sedan juli 20041 183 inlägg
#8

Men någonstans måste man ju välja vilken typ det är. Gör man det via

AbstractBondProfile abf = otherClass.getBondInstance();

i ditt fall?

Medlem sedan dec. 2004736 inlägg
#9

lilja skrev:

Men någonstans måste man ju välja vilken typ det är. Gör man det via

AbstractBondProfile abf = otherClass.getBondInstance();

i ditt fall?

Ja. otherClass.getBondInstance(); kommer returnera någon av BTPBondProfile, BOTBondProfile eller EUBondProfile.

Medlem sedan juli 20041 183 inlägg
#10

Jahaaaaa, men då så :) Jag förstår konceptet tror jag men jag förstod inte riktigt hur det skulle implementeras. Eller ja, jag har gjort liknande tidigare men tänkte att detta kanske var något annat. Nu förstår jag. Tack alla! :)

Medlem sedan mars 20007 896 inlägg
#11

För att tillägga till Ledel's svar: otherClass.getBondInstance() returnerar ett objekt av godtycklig typ - så länge objektet som returneras ärver från AbstractBondProfile kommer allting att gå fin-fint. Objektorientering!

133 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)