構造化プログラミングの三重境界:山を見るのは山である:素朴な直観論理プログラミング


『五灯会元』巻十七の中に、青原惟信禅師の語録がある.「老僧が三十年前に参禅しなかった時、山を見るのは山で、水を見るのは水である.後になって知識を親見し、山を見るのは山ではなく、水を見るのは水ではない.今、休みの場所を得て、前に山を見るのは山で、水を見るのは水にすぎない」.これは私たちの世界に対する観察と思考の過程を描いている.私たちが物事に執着する観察と思考さえすれば、それは物事を認識する過程でいつも以上の3つの異なる過程と境界を経ている.
このセクションでは、プログラマとして構造化プログラミングにどのように対処すべきかを一例で説明します.まず業務を説明します:ホテルのチェックアウト業務の中で以下の業務規則があります:ホテルの住宅規則の取引先によって1日泊まって計算して、翌日の12時以降、18時以前にチェックアウトの手続きをする者、ホテルは半日の部屋代をプラスします;翌日18時以降にチェックアウトの手続きをする者は、1日の部屋代を加算します.このビジネス・ルールに従って、ユーザーが何日滞在しているかを計算するプログラムを作成します.
 
 
具体的なコードを書く前に、筆者のアドバイスはまず何をするかを考えてみましょう.考えずにコードを書き始めないでください.そうすれば、すべてのコードが無効になるか、管理しにくいです.
需要分析から、ホテルのチェックアウトの業務では少なくとも以下のデータが必要です:チェックイン日、チェックアウト日、何日泊まったか.そして、チェックイン日からチェックアウト日までの数泊を計算し、チェックアウト日の具体的な時間を計算し、日数を多く計算するかどうかを計算します.私たちは最も素朴な論理で、最初のコードを書きます.
   
   
   
   
  1. static void Main(string[] args)  
  2. {  
  3.     DateTime indate = new DateTime(2008, 9, 30);                //  
  4.     DateTime outdate = new DateTime(2008, 10, 5);            //  
  5.     double days = (outdate - indate).Days;                     //  
  6.  
  7.     if (outdate.Hour <= 12)                                // 12  
  8.     {  
  9.         days += 0;  
  10.     }  
  11.  
  12.     if (outdate.Hour > 12 && outdate.Hour <= 18)                // 12 18  
  13.     {  
  14.         days += 0.5;  
  15.     }  
  16.  
  17.     if (outdate.Hour > 18)                                    // 18  
  18.     {  
  19.         days++;  
  20.     }  
  21.     System.Console.WriteLine(" /n {0}/n {1}/n {2} ", indate, outdate, days);  
  22.  
  23. }  

結果の出力から分かるように、お客様は2008年9月30日の真夜中にチェックインし、2008年10月5日の真夜中にチェックアウトしました(このチェックアウト時間は本当に奇妙ですね)、私たちのプログラムはお客様が5日間泊まったことを計算しました.このデータは私たちが予想したデータと同じです.
チェックアウト時間を以下のデータに変更すると
 
DateTime indate
=
new
DateTime(
2008
,
9
,
30
);
//
チェックイン時間
DateTime outdate
=
new
DateTime(
2008
,
10
,
5
,
12
,
15
,
12
);
//
チェックアウト時間
 
私たちが予想した5.5日ではなく、依然として5日であることに驚くでしょう.言い換えれば、チェックアウト時間が12時15分12秒の場合、プログラムの論理は以下の判断に入らない
 
 
if
(outdate.Hour
>
12
&&
outdate.Hour
<=
18
)
//
12時と18時の間に
{ days
+=
0.5
; }
 
 
冷静に考えてみると、実はコンピュータは間違っていません.確かに私たちの論理に穴があります.現在、チェックアウト時間が12時を超えていますが、この日付の時間部分の値はまだ12なので、私たちが見たくない論理的なエラーが発生しました.したがって,DataTime構造のHourメンバーの値は,我々の通常の意味での何時ではなく,時間の時間部分の値であるという概念を得た.具体的にきちんとしているかどうかは、私たち自身が判断し、処理する必要があります.