はじめに
職場で非機能要件をまとめる際に「稼働率99%って、年間停止時間がどれ位だっけ?」という話になりました。
1年間で365日ということは、稼働率99%だとざっくり3日強ではないかという予測は立てられますが、正確な年間停止時間をパッと言える人はほとんどいないと思います。
そこで「稼働率から年間停止時間を求める処理」と、逆に「年間停止時間から稼働率を求める処理」を書いてみました。
作成したコード
- 可用性を表すAvailabilityクラスには2つコンストラクタを用意しており、引数がdoubleの時は稼働率、intの時は年間停止時間を受け取るという形にしました。
- そのため、稼働率->年間停止時間の変換処理だけが必要であれば、引数がintのコンストラクタは不要となります。
- 後から思ったのですが、「稼働率クラス」と「年間停止時間クラス」に分けて、それぞれで変換処理を持たせた方が自然だったかもしれません。
- 他にももっとスッキリ書ける方法があるかもしれませんが、久々にJavaを触ったのでこれが限界でした...
Availability.java
/**
* 可用性クラス
* @author NKOJIMA
*/
public class Availability {
/** 1年間の秒数 */
private static final int SECONDS_PER_YEAR = 365 * 24 * 60 * 60;
/** 稼働率(%) */
private double occupancyRate;
/** 年間停止時間(秒) */
private double annualDownTimeSec;
/**
* コンストラクタ
* @param occupancyRate 稼働率(%)
*/
public Availability(double occupancyRate) {
this.occupancyRate = occupancyRate;
this.calcDowntimeAsSec();
}
/**
* コンストラクタ
* @param annualDownTimeSec 年間停止時間(秒)
*/
public Availability(int annualDownTimeSec) {
this.annualDownTimeSec = (double)annualDownTimeSec;
this.calcOccupancyRate();
}
/**
* 稼働率(%)から年間停止時間(秒)を求める。
*/
private void calcDowntimeAsSec() {
this.annualDownTimeSec = SECONDS_PER_YEAR - (SECONDS_PER_YEAR * this.occupancyRate / 100);
}
/**
* 年間停止時間(秒)から稼働率(%)を求める。
*/
private void calcOccupancyRate() {
this.occupancyRate = 100 - (this.annualDownTimeSec / SECONDS_PER_YEAR * 100);
}
/**
* 年間停止時間を標準出力する。
* @return
*/
public void printDowntime() {
int numOfDays = 0;
int hour = (int)annualDownTimeSec / 3600;
int minute = ((int)annualDownTimeSec % 3600) / 60;
int second = (int)annualDownTimeSec % 60;
if (hour > 24) {
numOfDays = hour / 24;
hour = hour % 24;
}
System.out.println("年間停止時間:" + numOfDays + "日" + hour + "時間" + minute + "分" + second + "秒");
}
/**
* 稼働率を標準出力する。
* @return
*/
public void printOccupancyRate() {
System.out.println("稼働率(%):" + String.format("%.5f", occupancyRate) + "%");
}
}
テスト用コード
public class AvailabilityTest {
public static void main(String[] args) {
// 稼働率(%)から年間停止時間を求める。
Availability av1 = new Availability(99d); // int型で渡すと年間停止時間(秒)として扱われてしまう
av1.printDowntime();
// 稼働率(%)から年間停止時間を求める。
Availability av2 = new Availability(99.5);
av2.printDowntime();
// 年間停止時間(秒)から稼働率(%)を求める。
Availability av3 = new Availability(10000);
av3.printOccupancyRate();
}
}
実行結果
年間停止時間:3日15時間36分0秒
年間停止時間:1日19時間48分0秒
稼働率(%):99.96829%