Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...


Code Block
languagejava
public class RandomProgram2 {
    Random random;
    Min min;
    Max max;
    Average average;
    
    void init() {
        random = new Random();
        min = new Min();
        max = new Max();
        average = new Average();
    }
    
    void run() {
        for (int i = 0; i < 1000; i++) {
            long randomValue = random.nextRandom();
            min.accumulate(randomValue);
            max.accumulate(randomValue);
            average.accumulate(randomValue);
        }
        System.out.println("Min: " + min.getMin());
        System.out.println("Max: " + max.getMax());
        System.out.println("Average: " + average.getAverage());
    }
    
    public static void main(String[] args) {
        RandomProgram2 program = new RandomProgram2();
        program.init();
        program.run();
    }
}

Objekttilstandsdiagrammet for klassen vil se slik ut:

PlantUML Macro
object "RandomProgram2" as rp0 {
}
object "Random" as random0 {
	mw = 31
	mz = 42
}
object "Min" as min0 {
	min = 9223372036854775807
}
object "Max" as max0 {
	max = -9223372036854775808
}
object "Average" as average0 {
	count = 0
	sum = 0
}
rp0 -right-> random0: random
rp0 -right-> min0: min
rp0 -right-> max0: max
rp0 -right-> average0: average

object "RandomProgram2" as rp1 {
}
object "Random" as random1 {
	mw = 558000
	mz = 1552698
}
object "Min" as min1 {
	min = 101758174128
}
object "Max" as max1 {
	max = 101758174128
}
object "Average" as average1 {
	count = 1
	sum = 101758174128
}
rp1 -right-> random1: random
rp1 -right-> min1: min
rp1 -right-> max1: max
rp1 -right-> average1: average

rp0 .down.> rp1: runde 1

object "RandomProgram2" as rp2 {
}
object "Random" as random2 {
	mw = 606816008
	mz = 1677283553
}
object "Min" as min2 {
	min = 101758174128
}
object "Max" as max2 {
	max = 109923061745416
}
object "Average" as average2 {
	count = 2
	sum = 110024819919544
}
rp2 -right-> random2: random
rp2 -right-> min2: min
rp2 -right-> max2: max
rp2 -right-> average2: average

rp1 .down.> rp2:  runde 2

object "RandomProgram2" as rp1000 {
}
object "Random" as random1000 {
	mw = 290483840
	mz = 1240974898
}
object "Min" as min1000 {
	min = 3057780577
}
object "Max" as max1000 {
	max = 158694648374228
}
object "Average" as average1000 {
	count = 1000
	sum = 78963637600257262
}
rp1000 -right-> random1000: random
rp1000 -right-> min1000: min
rp1000 -right-> max1000: max
rp1000 -right-> average1000: average

rp2 .down.> rp1000:  ... runde 1000

Programmet har i praksis samme totaltilstand som i den første varianten, men tilstanden er fordelt over flere objekter. Istedenfor ett komplekst objekt, så har en fem mindre komplekse objekter.

Selv om gevinsten ikke er så stor for et så lite system, så er tilsvarende opprydding helt essensielt for å håndtere kompleksiteten til store systemer.


Code Block
languagejava
public class Random {

    // from http://en.wikipedia.org/wiki/Random_number_generation

    long mw = 31;
    long mz = 42;
     
    long nextRandom() {
        mz = 36969 * (mz & 65535) + (mz >> 16);
        mw = 18000 * (mw & 65535) + (mw >> 16);
        return (mz << 16) + mw;
    }
}


Code Block
languagejava
public class Min {
    long min = Long.MAX_VALUE;
    
    public long getMin() {
        return min;
    }
    
    void accumulate(long value) {
        if (value < min) {
            min = value;
        }
    }
}


Code Block
languagejava
public class Max {
    long max = Long.MIN_VALUE;
    
    public long getMax() {
        return max;
    }
    
    void accumulate(long value) {
        if (value > max) {
            max = value;
        }
    }
}


Code Block
public class Average {
    long count = 0, sum = 0;
    
    long getAverage() {
		if (count == 0) {
			return 0;
		}
        return sum / count;
    }
    
    void accumulate(long value) {
        sum += value;
        count++;
    }
}