ソフトウェア制作論 平成30年10月31日
第6章 モジュール分割2 プログラムの拡張性・保守性の向上 第6章 モジュール分割2 プログラムの拡張性・保守性の向上 <本日の学習のねらい> プログラム をモジュール化しておけば、その修正や拡張は比較的容 易に行える。 このことを前章のプログラムを拡張することで体験する。
復習) 前章で作成したプログラム トップダウン的思考に基づいて作成した。 復習) 前章で作成したプログラム メインプログラム(jButtonCalcActionPerformed())の設計 メソッドgetWeekDay(int year, int month, int day)の定義 うるう年の判定 boolean isLeapDay(int year) メソッドgetDayNumber(int year, int month, int day)の定義 トップダウン的思考に基づいて作成した。
基礎課題6-1 どこを修正すれば良いか? private void jButtonCalcActionPerformed(ActionEvent evt) { int year=Integer.parseInt(jTextFieldYear.getText()); int month=Integer.parseInt(jTextFieldMonth.getText()); int day=Integer.parseInt(jTextFieldDay.getText()); String weekDay=getWeekDay(year,month,day); jLabelResult.setText(weekDay+"です。"); } メインプログラムは修正する必要はない。
基礎課題6-1 どこを修正すれば良いか? private void jButtonCalcActionPerformed(ActionEvent evt) { int year=Integer.parseInt(jTextFieldYear.getText()); int month=Integer.parseInt(jTextFieldMonth.getText()); int day=Integer.parseInt(jTextFieldDay.getText()); String weekDay=getWeekDay(year,month,day); jLabelResult.setText(weekDay+"です。"); } メインプログラムは修正する必要はない。 getWeekDay()メソッドを拡張(改良)すれば良い。
基礎課題6-2 String getWeekDay(int year, int month, int day) { int dayNumber=getDayNumber(year,month,day); int no=dayNumber % 7; String[] weekDay={"日曜日","月曜日","火曜日","水曜日", "木曜日","金曜日","土曜日"}; String ans= weekDay[no]; return ans; }
基礎課題6-2 String getWeekDay(int year, int month, int day) { if(year>=2001) { int dayNumber=getDayNumber(year,month,day); int no=dayNumber % 7; String[] weekDay={"日曜日","月曜日","火曜日","水曜日", "木曜日","金曜日","土曜日"}; return weekDay[no]; } else { }
基礎課題6-2 String getWeekDay(int year, int month, int day) { if(year>=2001) { int dayNumber=getDayNumber(year,month,day); int no=dayNumber % 7; String[] weekDay={"日曜日","月曜日","火曜日","水曜日", "木曜日","金曜日","土曜日"}; return weekDay[no]; } else { int dayNumber=getDayNumberBefore(year,month,day); String[] weekDay={“月曜日”,“日曜日”,“土曜日”,“金曜日”, “木曜日",“水曜日”,“火曜日”}; }
基礎課題6-3 int getDayNumberBefore(int year, int month, int day) { int ans=0; return ans; }
基礎課題6-3 int getDayNumberBefore(int year, int month, int day) { int[] monthDay={0,31,28,31,30,31,30,31,31,30,31,30,31}; int ans=0; // 2000年12/31から(year+1)年1/1まで日数のカウント for(int i=2000;i>year;i--){ if( isLeapDay(i) ){ ans=ans+366; } else { ans=ans+365; } // year年の12/31から(month+1)月の1日までの日数のカウント // month月の月末からday日までの日数のカウント+1 return ans;
基礎課題6-4 ・・・ // year年の12/31から(month+1)月の1日までの日数のカウント for( int i=12;i>month;i-- ){ ans=ans+monthDay[i]; //うるう年の補正 if( i==2 && isLeapDay(year) ){ ans=ans+1; } // month月の月末からday日までの日数のカウント+1 ans =ans+monthDay[month]-day; if( month==2 && isLeapDay(year) ){ return ans;
基礎課題6-4 ・・・ // year年の12/31から(month+1)月の1日までの日数のカウント for( int i=12;i>month;i-- ){ ans=ans+monthDay[i]; //うるう年の補正 if( i==2 && isLeapDay(year) ){ ans=ans+1; } // month月の月末からday日までの日数のカウント+1 ans =ans+monthDay[month]-day; if( month==2 && isLeapDay(year) ){ return ans;
基礎課題6-4 ・・・ // year年の12/31から(month+1)月の1日までの日数のカウント for( int i=12;i>month;i-- ){ ans=ans+monthDay[i]; //うるう年の補正 if( i==2 && isLeapDay(year) ){ ans=ans+1; } // month月の月末からday日までの日数のカウント+1 ans =ans+monthDay[month]-day; if( month==2 && isLeapDay(year) ){ return ans;
基礎課題6-4 ・・・ // year年の12/31から(month+1)月の1日までの日数のカウント for( int i=12;i>month;i-- ){ ans=ans+monthDay[i]; //うるう年の補正 if( i==2 && isLeapDay(year) ){ ans=ans+1; } // month月の月末日からday日までの日数のカウント+1 ans =ans+monthDay[month]-day+1; if( month==2 && isLeapDay(year) ){ return ans;
基礎課題6-4 ・・・ // year年の12/31から(month+1)月の1日までの日数のカウント for( int i=12;i>month;i-- ){ ans=ans+monthDay[i]; //うるう年の補正 if( i==2 && isLeapDay(year) ){ ans=ans+1; } // month月の月末からday日までの日数のカウント+1 ans =ans+monthDay[month]-day; if( month==2 && isLeapDay(year) ){ return ans;
モジュール化のメリット 構造が明晰なので、拡張や修正がしやすい。→ 拡張・修正の箇所 を限定し、そこに集中して作業できる。
応用課題6-A if( c[i]<'0' || c[i]>'9' ) { if( inputFlag ) { int getInputValue(String inputStr){ char[] c=inputStr.toCharArray(); boolean inputFlag=true; for(int i=0; i< c.length; i++) { if( c[i]<'0' || c[i]>'9' ) { inputFlag=false; break; } if( inputFlag ) { int ans=Integer.parseInt(inputStr); return ans; } else { jLabelResult.setText("入力欄に整数以外が入力されています。"); int ans=-1;