Praktikum 6 -- ülesanne klassis

Disainime uue kalkulaatori, kus saaks tehteid ilma Caclulator klassi muutmata juurde lisada. Vaatame, mis mustreid saab kasutada.

1. Toetatavate operatsioonide abstrahheerimine.

  • Kalkulaatori poolt toetatavate operatsioonide abstrahheerimine strategy patterni abil.
  • Eesmärk: klass Calculator peaks olema laiendatav selliselt, et selle kasutajad saaksid lisada uusi operatsioone (tehteid) ilma klassi ennast muutmata. (Taolised nõudmised on väga tüüpilised erinevatele frameworkide disainimisel. Seejuures on oluline, et kasutajad saaksid selle erinevaid osasid kerge vaevaga laiendada, aga ei peaks seejuures muutma frameworki enda klasse).
  • Teostus:
    1. Lahendada ülesanne kasutades strategy patternit. Luua tehete jaoks interface BinaryOperation ja seda realiseerivad klassid AdditionOperation liitmise ja SubtractionOperation lahutamise jaoks.
    2. Lisada klassi Calculator meetod performOperation, mis võtab argumendiks objekte tüüpi BinaryOperation ja teostab vastavaid tehteid.
    3. Muuta klassi Calculator meetodeid add ja subtract, et kasutataks liitmist ja lahutamist realiseerivaid operatsiooniklasse ja meetodit performOperation.
    4. Lisada ka analoogne interface UnaryOperation unaarsete tehete jaoks (näiteks ruutu tõstmine, kuupi tõstmine, faktori leidmine, jne).
    5. Kontrollida, et olemasolevad automaattestid endiselt läbiksid. Lisada testidesse uus test-meetod korrutamise testimiseks ja kontrollida et see läbiks:
    @Test
    public void testMultiply() {
        BinaryOperation multiply = new BinaryOperation() {
            public Integer performOperation(Integer a, Integer b) {
                return a*b;
            }
        };

        // 7 * 3 = 21?
        calculator
            .setDisplayValueTo(7)
            .performOperation(multiply, 3);
        assertEquals(calculator.getDisplayValue(), new Integer(21));
    }

2. Operatsioonide loomise viimine factory'sse

  • Eesmärk: interface'i BinaryOperation realiseerivate klasside isendite loomine viikse klassi OperationFactory.
  • Teostus:
    1. Luua klass OperationFactory, millel on staatilised meetodid BinaryOperation isendite loomiseks:
      • public static BinaryOperation createAdditionOperation()
      • public static BinaryOperation createSubtractionOperation()
      • public static BinaryOperation createMultiplicationOperation()
      • public static UnaryOperation createSquareOperation()
    2. Muuta klassi Calculator ja ka teste nii, et igal pool BinaryOperation isendite loomiseks kasutataks OperationFactoryt.
    3. Peale seda võib kaotada ka nüüdseks üleliigsed klassid AdditionOperation ja SubtractionOperation.

3. Valemite kirjeldamine puuna

  • Eesmärk: Kalkulaator panna ainult viimase väärtuse asemel meelde jätma kogu järjestikkust arvutuskäiku valemina. Valemid esitada composite pattern abil puu-struktuurina.
  • Teostus:
    1. Luua interface AbstractValue ja seda laiendavad klassid:
      • SimpleValue - sisaldab ainult ühte Integer välja
      • UnaryOperationValue - sisaldab mingit UnaryOperation tehet ja tehte argumenti tüübina IValue.
      • BinaryOperationValue - sisaldab mingit BinaryOperation tehet ja kahte tehte argumenti tüüpidena IValue
  • Näide:
    • Näiteks valem (7^2 + 1) * 2 näeks puu kujul välja järgmine. Kui kujutada ette taskukalkulaatorit, siis sellise tulemuseni jõudmiseks tuleks järjest vajutada kalkulaatori nuppe "7", "^2", "+", "1", "*", "2". Vaata ka all järgnevat testi.
  1. Lisada testide hulka järgmine test. Lõpuks peab see test läbima:
    @Test
    public void testEquation() {

        (7^2 + 1) * 2  == 100? 
    	calculator
    		.setDisplayValueTo(7)
    		.performOperation(OperationFactory.createSquareOperation())
    		.performOperation(OperationFactory.createAdditionOperation(), 1)
    		.performOperation(OperationFactory.createMultiplicationOperation(), 2);

        assertEquals(calculator.getDisplayValue(), new Integer(100));
    }

Lingid

edit