0

キーと値でいくつかの統計情報を見つけるのに2つのインターフェイスがあり、もう1つはオブジェクトを訪問してそれを反復するために使用される2つのインターフェイスを持っています。最初のメソッドは次のとおりです。コードをリファクタリングしてジェネリックで機能的なインターフェイスにする

public interface Statistic { 

    public String getKey(); 

    public Object getValue(); 

    public String getDetails(); 
} 

そして、ここでそれのための実装です:

public class Collector implements Statistic { 

    private String key; 
    private int val; 

    public Collector(String key, int val) { 
     this.key = key; 
     this.val = val; 
    } 

    public void setValue(int val) { 
     this.val = val; 
    } 

    @Override 
    public String getKey() { 
     return key; 
    } 

    @Override 
    public Integer getValue() { 
     return val; 
    } 

    @Override 
    public String getDetails() { 
     return null; 
    } 
} 

そしてもう一つは、以下があります。

public interface StatisticsCollector<T extends Object, S extends Statistic> { 

    public String getName(); 

    public void visit(T object); 

    public Iterator<S> calculatedStatistics(); 
} 

そして、ここではそれのための実装です:

public class CalculateFromObject<K, V> implements StatisticsCollector<Object, Collector> { 

    EmployeeValidator empValidator = new EmployeeValidator(); 
    StringValidator strValidator = new StringValidator(); 

    @Override 
    public String getName() { 
     return null; 
    } 

    @Override 
    public void visit(Object object) { 
     if (object instanceof String) { 
      String str = object.toString(); 

      int upperCaseCount = strValidator.upperCaseFreq(str); 
      strValidator.set.add(new Collector("Upper Case Letters: ", upperCaseCount)); 
      int lowerCaseCount = strValidator.lowerCaseFreq(str); 
      strValidator.set.add(new Collector("Lower Case Letters: ", lowerCaseCount)); 
      int digitsCount = strValidator.digitFreq(str); 
      strValidator.set.add(new Collector("Digits Count: ", digitsCount)); 
      int wordCount = strValidator.wordFreq(str); 
      strValidator.set.add(new Collector("Words Count: ", wordCount)); 
      int nonWordCount = strValidator.nonWordFreq(str); 
      strValidator.set.add(new Collector("Non Word Count: ", nonWordCount)); 

     } else if (object instanceof Employee) { 

      Employee emp = (Employee) object; 
      empValidator.salaryValidator(emp); 
      empValidator.birthDateValidator(emp); 
      empValidator.birthPlaceValidator(emp); 
      empValidator.resignationDateValidator(emp); 
      empValidator.positionValidator(emp); 
     } 
    } 

    @Override 
    public Iterator<Collector> calculatedStatistics() { 
     return empValidator.set.iterator(); 
    } 


} 

そして、私のパッケージに私は彼らのセッターとゲッターとのfirstName、lastNameの、給与や位置などのいくつかのプロパティを持っている従業員のための豆を持っています。

私は私のxの給料を持っており、1990年に生まれ、これらの検証のために以下のクラスでしたされ、従業員の数を得るようないくつかの検証を行うしたいと思います:

public class EmployeeValidator { 

    public Set<Collector> set = new HashSet<>(); 

    public void salaryValidator(Employee emp) { 
     int count = 0; 
     // each collector consist of a condition (function), key, value (always incremented) 
     if (emp.getSalary() < 350) { 
      set.add(new Collector("Employee with salaries less than 350JD: ", ++count)); 
     } else if (emp.getSalary() >= 350 && emp.getSalary() < 600) { 
      set.add(new Collector("Employee with salaries between 350JD And 600JD: ", ++count)); 
     } else if (emp.getSalary() >= 600 && emp.getSalary() < 1200) { 
      set.add(new Collector("Employee with salaries between 600JD And 1200JD ", ++count)); 
     } else if (emp.getSalary() >= 1200) { 
      set.add(new Collector("Employee with salaries more than 1200JD: ", ++count)); 
     } 

    } 

    public void birthDateValidator(Employee emp) { 
     for (Collector stats : set) { 
      if (("Employees that where born in " + emp.getBirthDate().getYear() + " = ").equals(stats.getKey())) { 
       count(stats); 
       return; 
      } 
     } 
     set.add(new Collector("Employees that where born in " + emp.getBirthDate().getYear() + " = ", 1)); 
    } 

    public void birthPlaceValidator(Employee emp) { 
     for (Collector stats : set) { 
      if (("Employees that where born in " + emp.getBirthPlace() + " = ").equals(stats.getKey())) { 
       count(stats); 
       return; 
      } 
     } 
     set.add(new Collector("Employees that where born in " + emp.getBirthPlace() + " = ", 1)); 
    } 

    public void resignationDateValidator(Employee emp) { 
     for (Collector stats : set) { 
      if (("Employees that where Resignation in " + emp.getResignationDate().getYear() + " = ").equals(
        stats.getKey())) { 
       count(stats); 
       return; 
      } 
     } 
     set.add(new Collector("Employees that where Resignation in " + emp.getResignationDate().getYear() + " = ", 1)); 
    } 

    public void positionValidator(Employee emp) { 
     for (Collector stats : set) { 
      if (("Employees that occupy the " + emp.getPosition() + " position = ").equals(stats.getKey())) { 
       count(stats); 
       return; 
      } 
     } 
     set.add(new Collector("Employees that occupy the " + emp.getPosition() + " position = ", 1)); 
    } 

    private void count(Collector stats) { 
     int counter = stats.getValue() + 1; 
     stats.setValue(counter); 
    } 
} 

をそして、私は別のクラスを持っています文字列の有効性を確認し、文字列の大文字の数、小文字の数などを確認してください。

CalculateFromObjectクラスのvisitメソッドで確認できますが、正常に動作していると私は期待された結果を得ていますが、私のコードは非常に効率的ではないので、私はそれをgeそれはオブジェクトの任意のタイプを受け入れるようにする、私はいくつかの試みを行っているが、私は立ち往生した。

私は条件に合格し、次のようにそれを確認することができます一つの方法を持っている条件と呼ばれる機能インタフェースを記述しようとしてい

public interface Conditions { 

    boolean checkCondition(Object obj); 

} 

だから、誰かが私を変更するための最良の方法は何か提案することができますジェネリックであり、Studentのようなあらゆるタイプのオブジェクトを受け入れ、できるだけクリーンなデザインパターンを適用することによってコードを作成することができますか?

答えて

1

クラスにはオーバーヘッドが多く、インターフェイスの誤解はPOJO's(シンプルクラス)です。高いレベルでは、以下を実行する必要があります。

1)。インターフェイスStatisticおよびクラスCollectorsを削除します。彼らは単にデータをカプセル化しているだけです。代わりに、POJO Employeeを必要なフィールド+ゲッター+セッターで作成します。 、「キー- [値]を使用して、これらのフィールドに意味のある名前を与えてはいけない:

2必要に応じて

public class Employee 
{ 
    private String name; 
    private int id; 
    private double salary; 
     ... 
    public String getName() {...} 
    public void setName(..) {...} 
// other getters/setters 
} 

は、コンストラクタを作成します)あなたのEmployeeクラスでも、それを削除し、冗長であるように見えます。代わりに新しい従業員を使用してください 3)Collectionsフレームワークを使用して、従業員のインスタンスのコレクションを保存します。

`List<Employee> employees = new ArrayList<>(); 
employees.add(new Employee(....)); ` 

4)。有効な方法でインタフェースEmployeeValidatorを作成し、それを実装:

public interface EmployeeValidator { void validate(List<Employee> employees); }

5)あなたは、例えば、いくつかの統計データを操作する従業員のコレクションで動作します別のStatisticsクラスを作成する場合

public class Statistics { 

    public double getAvgSalary(List<Employee> employees) 
    { 
     double avgSalary = 0; 
     for (Employee e : employees) { 
     .... 
     } 
    } 
} 
+0

タスクは彼らに –

+0

主なアイデアを実装することであるように私は、インタフェース統計とコレクタを削除傾けるあなたがインターフェイスを悪用しているということです。クラスでそれをリファクタリングし、必要なものを残してください –

+0

これはどういう意味ですか、私はそれを一般的にして、Studentオブジェクトに対して同じように実装するのは簡単ですか? –

関連する問題