refactoring quiz

a tovabb mogott a kodreszlet. nyeremeny nincs, ha nemir senki holnapig semmi jot, megirom en mi lett a megoldasom.. :)


    private void match(NodeChannelFieldCompositeKey key, double value, SLA sla) {
        if(sla == null)
            return;

        if(sla.type == SLAType.LowerLimit) {
            if(value < sla.errorValue) {
                ViolationType t = violations.put(key, ViolationType.ERROR);
                if(t == null) {
                    createLog(key, sla, value, "ERROR level violation");
                } else if(t == ViolationType.WARNING) {
                    createLog(key, sla, value, "SLA violation changed from WARNING to ERROR");
                }
            }
            else if(value < sla.warningValue) {
                ViolationType t = violations.put(key, ViolationType.WARNING);
                if(t == null) {
                    createLog(key, sla, value, "WARNING level violation");
                } else if(t == ViolationType.ERROR) {
                    createLog(key, sla, value, "SLA violation changed from ERROR to WARNING");
                }
            } else {
                ViolationType t = violations.remove(key);
                if(t != null) {
                    createLog(key, sla, value, "SLA violation ended");
                }
            }
        } else if(sla.type == SLAType.UpperLimit) {
            if(value > sla.errorValue) {
                ViolationType t = violations.put(key, ViolationType.ERROR);
                if(t == null) {
                    createLog(key, sla, value, "ERROR level violation");
                } else if(t == ViolationType.WARNING) {
                    createLog(key, sla, value, "SLA violation changed from WARNING to ERROR");
                }
            }
            else if(value > sla.warningValue) {
                ViolationType t = violations.put(key, ViolationType.WARNING);
                if(t == null) {
                    createLog(key, sla, value, "WARNING level violation");
                } else if(t == ViolationType.ERROR) {
                    createLog(key, sla, value, "SLA violation changed from ERROR to WARNING");
                }
            } else {
                ViolationType t = violations.remove(key);
                if(t != null) {
                    createLog(key, sla, value, "SLA violation ended");
                }
            }
        }
    }

Hozzászólások

Hát így az osztályok, enumok nélkül nem túl jó, mert minden alá van húzva pirossal. Elsőre most így ennyi sikerült. Még ma lehet ránézek kicsit, de most meguntam, pedig még van benn tartalak. Persze lehet már most is elrontottam. :)


    private void match(NodeChannelFieldCompositeKey key, double value, SLA sla) {
        if(sla == null)
            return;

        if((value < sla.errorValue && sla.type == SLAType.LowerLimit) || (value > sla.errorValue && sla.type == SLAType.UpperLimit)) {
            callCreateLog(ViolationType.ERROR, ViolationType.WARNING, key, value, sla);
        }
        else if((value < sla.warningValue && sla.type == SLAType.LowerLimit) || (value > sla.warningValue && sla.type == SLAType.UpperLimit)) {
            callCreateLog(ViolationType.WARNING, ViolationType.ERROR, key, value, sla);
        } else if (sla.type == SLAType.LowerLimit || sla.type == SLAType.UpperLimit) {
            remove(key, value, sla);
        }
    }
    
    private void callCreateLog(ViolationType v1, ViolationType v2, NodeChannelFieldCompositeKey key, double value, SLA sla) {
        ViolationType t = violations.put(key, v1);
        if(t == null) {
            createLog(key, sla, value, v1.toString() + " level violation");
        } else if(t == v2) {
            createLog(key, sla, value, "SLA violation changed from " + v2.toString() + " to " + v1.toString());
        }
    }
    
    private void remove(NodeChannelFieldCompositeKey key, double value, SLA sla) {
        ViolationType t = violations.remove(key);
        if(t != null) {
            createLog(key, sla, value, "SLA violation ended");
        }
    }

private void match(NodeChannelFieldCompositeKey key, double value, SLA sla, SLAHandler[] handlers) {
  if (sla == null) {
    return
  }

  for (SLAHandler handler:  handlers) {
    if (handler.accept(sla, value)) {
      handler.processSLA(key, value, sla);
      return;
    }
  }
}

Az interface definicioja ez alapjan egyertelmu, szerintem. A kulonbozo implementaciokba mehet az if-eken beluli trutyi.

Ilyesmikre gondoltam:


class LowerLimitSLAHandler implements SLAHandler {
  public booealn accept(SLA sla, double value) {
    return sla.type == SLAType.LowerLimit && value < sla.errorValue;
  }

  public void process(Map<?, ?> violations) {
    ViolationType t = violations.put(key, ViolationType.ERROR);
    if(t == null) {
      createLog(key, sla, value, "ERROR level violation");
    } else if(t == ViolationType.WARNING) {
      createLog(key, sla, value, "SLA violation changed from WARNING to ERROR");
    }
  }
}

Es igy tovabb. Oke, megvaltozott az interface, meg a createLog csak log a levegoben, de talan jobban mutatja mi az elkepzeles.