2016-12-22 4 views
0

私はクラス:データ、calss:アラームを持っています。 統計データが出力され、npoi.Alarmがnullの可能性があります。 は今私のコードです:すべてのBeanメンバーのコードをより美しく処理できますか?

while (it.hasNext()){  
      Data t = it.next(); 
      row = sheet.createRow(index++); 
      Alarm a=alarms.get(t.getDeviceid().trim()); 
       cell = row.createCell(0); 
      if(a==null||inRange(t.getNoise(),a.getNoiselow(),a.getNoiseup())) 
        cell.setCellStyle(styleNormal); 
      else 
       cell.setCellStyle(styleError); 
      cell.setCellValue((double)t.getNoise()); 
      cell = row.createCell(1); 
      if(a==null||inRange(t.getPm(),a.getPmlow(),a.getPmup())) 
        cell.setCellStyle(styleNormal); 
      else 
       cell.setCellStyle(styleError); 
      cell.setCellValue((double)t.getPm()); 
      cell = row.createCell(2); 
      if(a==null||inRange(t.getPressure(),a.getPressurelow(),a.getPressureup())) 
        cell.setCellStyle(styleNormal); 
      else 
       cell.setCellStyle(styleError); 
      cell.setCellValue((double)t.getPressure()); 
     .... 

私はすべてのBeanのプロパティを繰り返して....私はそのようなコードを向上させることができますか?

+0

'a == null || ...は本当に混乱している。なぜあなたは 'a!= null && ...'よりそれを好んだのですか? – Spotted

+0

あなたは 'Data'と' Alarm'を変更できますか? – Spotted

+0

いいえ、データとアラームのみ読み取り、多くのproperty.noise ... pm ... windspeed .... @ Spotted – fe263

答えて

1

最も簡単な方法:繰り返しコードを見つけて、それをメソッドに入れます。

cell = row.createCell(0); 
    if(a==null||inRange(t.getNoise(),a.getNoiselow(),a.getNoiseup())) 
     cell.setCellStyle(styleNormal); 
    else 
     cell.setCellStyle(styleError); 
    cell.setCellValue((double)t.getNoise()); 

あなたはこの方法では、コードの上に置くとwhileループ内から呼び出すことができます。

private void setCell(Row row, Data data, int cellIndex) 
{ 
     cell = row.createCell(cellIndex); 
     Alarm a=alarms.get(data.getDeviceid().trim()); 
     if(a==null||inRange(data, a, cellIndex)) 
      cell.setCellStyle(styleNormal); 
     else 
      cell.setCellStyle(styleError); 

     // You can also do as below if you can read it easily!! 
     // cell.setCellStyle(a==null||inRange(data, a, cellIndex)?styleNormal:styleError); 

     // This switch-case should also be moved to separate method. 
     // Leaving that to you. 
     switch(cellIndex) 
     { 
      case 0: cell.setCellValue((double)data.getNoise()); break; 
      case 1: cell.setCellValue((double)t.getPm()); break; 
      ... 
      ... 
      default: /*set default value and break or throw InvalidCellIndex exception*/ 
     } 
} 

private boolean inRange(Date data, Alarm a, int cellIndex) 
{ 
     switch(cellIndex) 
     { 
      case 0: return inRange(data.getNoise(),a.getNoiselow(),a.getNoiseup(); 
      case 1: return inRange(data.getPm(),a.getPmlow(),a.getPmup(); 
      ... 
      ... 
      default: /* throw InvalidCellIndex exception*/ 
     } 
} 
0

私は繰り返しのコードがメソッドに抽象化されるべきであると@Azodiousに同意するが、私は少し異なり、それを処理します:

while (it.hasNext()){  
    Data t = it.next(); 
    row = sheet.createRow(index++); 
    Alarm a=alarms.get(t.getDeviceid().trim()); 
    setNoise(row, 0, t, a); 
    setPm(row, 1, t, a); 
    ... 
} 

private void setCellValue(Row row, int cellIndex, double value, boolean error) { 
    Cell cell = row.createCell(cellIndex); 
    if (error) { 
     cell.setCellStyle(styleError); 
    } else { 
     cell.setCellStyle(styleNormal); 
    } 
    cell.setCellValue(value); 
} 

private void setNoise(Row row, int cellIndex, Data t, Alarm a) { 
    setCellValue(row, cellIndex, data.getNoise(), 
     a == null || inRange(t.getNoise(),a.getNoiselow(),a.getNoiseup())); 
} 

... 
関連する問題