kazpgmの日記

『プログラム自動作成@自動生成』作成の日記

TOOL更新_zendframework付録 B. Zend Framework PHP 標準コーディング規約をどう反映するか調査する。

http://framework.zend.com/manual/ja/coding-standard.php-file-formatting.html (New BSD License)から抜粋してお助けTOOLにどう反映するか調査する。ToDoリストの(http://d.hatena.ne.jp/kazpgm/20090403/1238773943)暫定99.の調査


  今後わかったことはここに書く。

B.1. 概要
B.1.1. 対象範囲
B.1.2. 目標

B.2. PHP ファイルの書式

B.2.1. 全般
 ・PHP コードのみからなるファイルでは、終了タグ ("?>") は決して含めてはいけません。

   <−お助けTOOLでは最後の”?>”の後、”改行EOF”または、”EOF”としている。修正する必要あるのかな?
    2010/01/12:PHP コードのみからなるファイルでは、終了タグ ("?>") を含めないようにする。


B.2.2. 字下げ
 ・字下げは空白 4 文字で行います。タブ文字を使ってはいけません。

   <−お助けTOOLではタグ文字を使っている。修正する必要あるのかな?
    2010/01/12:タグ文字のままで行く。

B.2.3. 1 行の長さ
 ・1 行の長さを 80 文字までにすることを目指しましょう。最大 120 文字までにするようにしましょう。

   <−お助けTOOLでは気にしていない。Viewやチェックロジックや、CSV出力など長くなる。修正する必要あるのかな?
    2010/01/12:1行の長さをあまり気にしないで行く。

B.2.4. 行末
 ・行末は、ラインフィード (LF) のみにしなければなりません。

   <−お助けTOOLではCRLFになっている。修正する必要あるのかな?
    2010/01/12:ラインフィード (LF)にする。

B.3. 命名規約
B.3.1. クラス
 ・クラス名には英数字のみが使用できます。クラス名に数字を使用することは可能ですが、ほとんどの場合はお勧めしません。アンダースコアはパス区切り文字としてのみ使用可能です。
 ・ファイル名が "Zend/Db/Table.php" の場合、クラス名を "Zend_Db_Table" としなければなりません。標準ライブラリや拡張ライブラリではないもの (たとえば、アプリケーションのコードや Zend 以外が作成したライブラリなど) については、"Zend_" や "ZendX_" で始まる名前は使用できません。

   <−お助けTOOLではクラス名はテーブル名+任意文字。「定義ファイル」に入力チェック(”_”はNG)を入れよう。
    2010/01/12 現在のクラス名でやることにする。
    2010/01/12 クラス名を階層に紐つけると、後で階層を変えるという場面でクラス名を変えることになる。これではハンドリングが難しいのでこの規則は使用しない。(1システム内のプログラム名(クラス名)はユニークにするという考えは持っている。フォルダが違うから同じ名前でもいいだろうという考えはNGだと思っている。 )
    2010/01/15 共通クラスは後々階層を変えることはあまりないとおもうのでクラス名を階層に紐つけてみる。例)’/Kazpgm/Common/AppCheckUtil.php’の場合、クラス名は "Kazpgm_Common_AppCheckUtil" となる。名前が長いので使い勝手が良くない。と思ったが2010/01/17にやはり階層に紐つけることにした。
    2010/01/17 プログラム名が階層に紐ついているとすぐにソースの場所がわかる。(Zendのソースがどこにあるか調べるときすごく便利だった。)。やはりクラス名に階層に紐つけることにする。調査しやすいということはバグを防ぐことになる。だだ、フォルダ名は短くする。Common−>Com。
    2010/03/25 最終的に、・・・共通クラスはCommonフォルダにしか置かない。・・・自分的には1phpに1クラスでphp名とクラス名が同じというのが違和感ない。ので、ZENDの命名方法を使わない。

B.3.2. ファイル名
 ・使用可能な文字は英数字・アンダースコア およびダッシュ文字 ("-") のみです。空白文字は使用できません。
 ・ビュースクリプト以外の拡張子は".php"でなければなりません
 ・クラス定義したファイルは階層的に設置する。(例:Admin_Company → Admin/Company.php)

  <−お助けTOOLでも拡張子は".php"で作成している。
  <−お助けTOOLではこの(”クラス定義したファイルは階層的に設置する。”)ような規約はないのでこれに沿った修正が必要。
    2010/01/12 前述

B.3.3. 関数およびメソッド
 ・オブジェクト指向のプログラミングでは、 インスタンス変数や静的変数にアクセスするためのメソッドは "get" あるいは "set" のいずれかで始めなければなりません。singleton や factory などのデザインパターンを使用する場合は、 メソッド名にパターンの名前を含めるようにしましょう。こうすることで、 どのパターンを使っているのかがわかりやすくなります。
 ・オブジェクト内で "private" あるいは "protected" と宣言されているメソッドについては、メソッド名の最初にアンダースコア 1 文字をつけなければなりません。アンダースコアを使用できるのは、 この場合のみです。"public" と宣言されているメソッドについては、 決してアンダースコアで始めてはいけません。
 ・グローバル関数は、できる限り使用しないようにしましょう。このような関数は、静的クラスにまとめることを推奨します。

  <−お助けTOOLでは取り立ててjavaのbeanみたいなsetter/getterを使用していない。
  2010/01/12:phpではプログラム中に「$this->_err」とか書くと自動的に変数が定義されてしまう。これだとコーディングミスが発見できない。そこでsetter/getterのメソッドをつくって使うことによってコーディングミスを防げる。と思ったが。
以下のようなPGMになる(array()は直接setterに入れれない。arrayは一度変数に入れてからでないと使えない。そのとき&をつけてアドレス渡しにしないといけない。)のもミスをさそうのでどうしようかな。
//$this->_err = array(); がこのようになる。
$err = array();
$this->setErr($err);
//$this->_o['c_elements_idx'] = '0';がこのようになる。
$o = & $this->getO();
$o['c_elements_idx'] = '0';


  <−"private" あるいは "protected" メソッドの先頭”_”なんてほんとに必要なのかな。お助けTOOLではどうしようか?。
   2010/01/12:"private" あるいは "protected" メソッドを後々publicに変えたりする。そのとき、先頭”_”をはずすことになる。ハンドリングが難しくなるのでこの規則は使用しない。と思ったが、2010/01/17 publicにするのではなく新たに先頭”_”のないpublicメソッドを作ればいいので、ハンドリングが難しくなるということはないということに気づいた。
   2010/01/17"private" あるいは "protected" メソッドの先頭”_”にしておくと、使うときにそのメソッドがpublicとして使えるのか使えないのかがわかるからいいのかな。(そうしたい理由があるはず、、なぜなのだろう、、。) 

  <−お助けTOOLではもともとのphpがクラスではないので基本的にグローバル変数を使用している。Zend FrameWorkではクラス変数にする。さらに$_RQQUEST、$_SERVERなどのスーパーグローバルを使っている。
  <−お助けTOOLではメソッド名にアンダースコア( _ )を使用していない。
   2010/01/12:アンダースコア( _ )はクラス変数の先頭のみに使用することにする。(メソッド名にアンダースコア( _ )を使用しない。)

  <−お助けTOOLではもともとのphpがクラスではないので基本的にグローバル変数を使用している。Zend FrameWorkではクラス変数にする。さらに$_RQQUEST、$_SERVERなどのスーパーグローバルを使っている。
   2010/01/12:グローバル変数に使用しない。クラス変数("private" あるいは "protected"でのみ作成する。)を使用する。$_RQQUEST、$_SERVERなどのスーパーグローバルは使用しない。
   2010/01/17"private" あるいは "protected" クラス変数の先頭”_”にしておくと、使うときにそのクラス変数がpublicとして使えるのか使えないのかがわかるからいいのかな。(そうしたい理由があるはず、、、なぜなのだろう、。)まあ、publicのクラス変数を使わなくする(setter/getterでハンドリングする)のでそれはそれでいいけれど。

B.3.4. 変数
 ・変数名に含めることができるのは英数字のみです。 アンダースコアを使用してはいけません。 数字を含めることは可能ですが、ほとんどの場合はお勧めしません。
   2010/01/12:変数名は英数字とする。
 ・クラス内で "private" あるいは "protected" と宣言されている変数については、変数名の最初にアンダースコア 1 文字をつけなければなりません。アンダースコアを使用できるのは、 この場合のみです。"public" と宣言されている変数については、決してアンダースコアで始めてはいけません。
   2010/01/12:"public"クラス変数を使用しない。クラス変数("private" あるいは "protected")は最初にアンダースコア 1 文字ではじめる。

 ・関数名と同様 (上の 3.3 を参照ください)、変数名も常に小文字で開始する "camelCaps" 方式を使用しなければなりません。

  <−お助けTOOLでは変数名にアンダースコア( _ )を使用していない。
   2010/01/12:関数名、変数名も常に小文字で開始する "camelCaps" 方式を使用する。(現在と同じ)

B.3.5. 定数
 ・定数名には英数字およびアンダースコアを使用することができます。 定数名には数字を使用してもかまいません。 定数名は、常にすべて大文字にします。
 ・定数を宣言する際には、クラスのメンバとして "const" で定義しなければなりません。"define" によるグローバル定数の宣言も可能ですが、お勧めしません。

  <−お助けTOOLでは定数名にはアンダースコアを使用している。すべて大文字英数としている。
  <−お助けTOOLではdefineを使用している。constに修正するということはConstクラスを作って使うということなのかな。
   2010/01/12:クラスの中にconst定義する。システム内共通は「AppConst.php」に集める。


B.4. コーディングスタイル
B.4.1. PHP コードの境界
 ・短いタグ(”<?”)は決して使用してはいけません。 PHP コードのみからなるファイルでは、終了タグ ("?>") は決して含めてはいけません

  <−お助けTOOLでは”<?”を多用している。”<?php”に変更する必要あるのかな?
   2010/01/12:”<?php”に変更する。

B.4.2. 文字列
B.4.2.1. 文字列リテラル
 ・文字列がリテラルである (変数の展開などが含まれない) 場合は、アポストロフィあるいは「シングルクォート」 で文字列を囲まなければなりません。

  <−お助けTOOLではそのようにしている。

B.4.2.2. アポストロフィを含む文字列リテラル
 ・リテラル文字列自体にアポストロフィが含まれている場合は、 引用符あるいは「ダブルクォート」で文字列を囲んでもかまいません。 特に SQL 文などでこのような場合がよくあるでしょう。

  <−お助けTOOLではそのようにしている。

B.4.2.3. 変数の展開
 ・一貫性を保つため、"こんにちは ${name} さん。ようこそ!" は許可されません。

  <−お助けTOOLでは”$hensu”を使用している。

B.4.2.4. 文字列の連結
 ・文字列の連結には "." 演算子を使用しなければなりません。コードを読みやすくするため、"." 演算子の前後には常にスペースを入れなければなりません

  <−お助けTOOLでは、ほとんど . の前後に半角スペースを入れている。このままでもOKのはず。

B.4.3. 配列
B.4.3.1. 数値添字の配列
 ・添字として負の数を使用してはいけません。
 ・数値添字の配列の添字は、0 以上の任意の数から始めることができます。 しかし、常に 0 から始めるようにすることを推奨します。
 ・array を使用して数値添字の配列を宣言する場合は、 コードを読みやすくするため、要素を区切るカンマの後にスペースを入れなければなりません。
 ・"array" を使用して、複数行にまたがる配列を宣言することも可能です。 その場合は、2 行目以降の行頭にスペースを入れ、 各行の開始位置が以下のようになるようにしなければなりません。

  <−お助けTOOLでは、ほとんど要素を区切るカンマの後にスペースを入れている。このままでもOKのはず。

B.4.3.2. 連想配列
 ・連想配列を array で宣言する場合には、 適宜改行をいれて複数行で宣言するようにしましょう。その場合は、 2 行目以降の行頭などにスペースを入れ、
  キーと値の位置がそれぞれ揃うようにしなければなりません。

  <−お助けTOOLでは、ほとんどそのようにしているはず。このままでもOKのはず。

B.4.4. クラス
B.4.4.1. クラス宣言
 ・開始波括弧は常にクラス名の下に書かなければなりません。
 ・PHPDocumentor の標準形式のドキュメントブロックがなければなりません。
 ・クラス内のコードは、すべて空白 4 文字で字下げします。
 ・ひとつの PHP ファイルにはクラス定義をひとつだけ含めるようにします。
 ・クラスファイルの中にクラス以外のコードを追加することもできますが、 お勧めしません。このような場合には、クラス定義とその他のコードの間に 空行を 2 行挿入しなければなりません。

  <−お助けTOOLではクラス名と後の { の間に改行を入れていない。改行入れる必要あるのかな?
  <−お助けTOOLでは”標準形式のドキュメントブロック”は入れていない。入れる必要あるのかな?
  <−お助けTOOLでは基本的にクラスを使っていない。Zend FrameWorkではクラスにする。
   2010/01/12:クラスに変更する。

B.4.4.2. クラスのメンバ変数
 ・メンバ変数は、以下の Zend Framework 変数命名規約に従わなければなりません。
 ・クラスの内部で使用する変数は、クラスの先頭 (あらゆるメソッド宣言より前) で宣言する必要があります。
 ・var 構文を使ってはいけません。メンバ変数を宣言する際には private、protectedあるいは public のいずれかの修飾子を用いてアクセス範囲を指定します。メンバ変数を public 宣言して外部からアクセスさせることもできますが、それよりはアクセサメソッド (set/get) を使用する方式のほうを推奨します。

  <−お助けTOOLでは変数定義なしに変数を使用している。Zend FrameWorkではすべて定義する。
   2010/01/17:・クラスの内部で使用する変数は、クラスの先頭 (あらゆるメソッド宣言より前) で宣言する。var 構文を使わない。(お助けTOOLではvarを使っていない。)。アクセサメソッド (set/get) は前述。

B.4.5. 関数およびメソッド
B.4.5.1. 関数およびメソッドの宣言
 ・関数は、以下の Zend Framework 関数命名規約に従わなければなりません。
 ・クラス内でメソッドを宣言する際には、常に private、protected あるいは public のいずれかの修飾子を用いてアクセス範囲を指定しなければなりません。
 ・クラスと同様、波括弧は関数名の次の行に書かなければなりません。関数名と引数定義用の開始括弧の間にはスペースを入れてはいけません。
 ・グローバルスコープの関数は、できるだけ使わないようにしましょう。
 ・クラス内の関数宣言の例として適切なものを次に示します。
 ・メソッドの実行時の参照渡しは禁止されている。 値の参照渡しは、メソッドの宣言時にパラメータを渡す部分においてのみ可能。
 ・返り値は () で囲まない (NG例:return ($a);)

  <−お助けTOOLではクラスにしていない。Zend FrameWorkにするとすべてクラス・メソッドになるので考慮する必要有り。
   2010/01/12:前述(クラスを使う)。
   2010/01/12:メソッドの実行時の参照渡しは行わない。
  
  <−お助けTOOLでは返り値に括弧で囲んでいるものはないはず。

B.4.5.2. 関数およびメソッドの使用法
 ・関数の引数を指定する際は、引数を区切るカンマの後に空白をひとつ入れます。例えば 3 つの引数を受け取る関数をコールする場合の例は、”threeArguments(1, 2, 3);”のようになります。
 ・コール時に引数を参照渡しすることは禁じます。
 ・引数として配列を受け取る関数については、関数コールの中に "array" 構文を含め、それを複数行に分けることもできます。

  <−お助けTOOLでは関数呼び出しで、コール時の引数を参照渡しを使っているかも。
   2010/01/12:メソッドの実行時の参照渡しは行わない。
  <−お助けTOOLではスペースを入れていないものもあるかも。このままでもOKのはず。

B.4.6. 制御構造
B.4.6.1. If/Else/Elseif
 ・if および elseif 系の制御構造では、 条件を指定する括弧の前に空白をひとつ入れなければなりません。また、条件指定の括弧を閉じた後にも空白をひとつ入れなければなりません。
 ・括弧で囲まれた条件文の中では、演算子の前後にも空白をいれなければなりません。 また、条件の論理的な区切りを明確にするため、条件文の中でも積極的に括弧を使用することを推奨します。
 ・開始波括弧は、条件文と同じ行に記述します。終了波括弧は、常に改行してそれのみで記述します。波括弧の中では、空白 4 文字の字下げを使用します。
 ・"elseif" を使用することは可能ですが、推奨されません。代わりに "else if" を使用してください。

  <−お助けTOOLでは条件を指定する括弧の前に空白をひとつ入れているはず。
  <−お助けTOOLでは{ } を入れているはず。入れている場所も説明と同じ。
  <−お助けTOOLでは”波括弧の中では、空白 4 文字の字下げ”はタブになっている。
  <−お助けTOOLではどちらかといえば"elseif"を使用している。
   2010/01/12:"else if"にする。

B.4.6.2. Switch
 ・"switch" を使用した制御文では、 条件を指定する括弧の前に空白をひとつ入れなければなりません。また、条件指定の括弧を閉じた後にも空白をひとつ入れなければなりません。
 ・"switch" 文の中身は、空白 4 文字の字下げを使用します。 各 "case" 文の中身は、さらに 4 文字ぶん字下げします。

  <−お助けTOOLでは条件を指定する括弧の前に空白をひとつ入れているはず。
  <−お助けTOOLでは”空白 4 文字の字下げ”はタブになっている。(4文字字下げしていないものもある)

B.4.7. インラインドキュメント
B.4.7.1. ドキュメントの書式
 ・ドキュメントブロック ("docblocks") は、phpDocumentor と互換性のある書式でなければなりません。phpDocumentor の書式については、このドキュメントの対象範囲外です。
 ・Zend Framework のために書かれたコード、あるいはフレームワーク上で操作するコードは、各ファイルの最初に「ファイルレベル」の docblock、 そして各クラスの直前に「クラスレベル」の docblock を含めなければなりません。

  <−お助けTOOLではインラインドキュメントはない。記述することにする。

B.4.7.3. クラス
 ・各クラスには、最低限これらの phpDocumentor タグを含む docblock が必要です。

  <−お助けTOOLではインラインドキュメントはない。記述することになる。

B.4.7.4. 関数
 ・オブジェクトのメソッドを含めたすべての関数には、 最低限以下の内容を含む docblock が必要です。関数についての説明、すべての引数、返り値

  <−お助けTOOLではインラインドキュメントはない。記述することにする。

 ■サイト:http://kazpgm.ddo.jp/

12:00-16:00 21:00-02:30