FLATzブログ

[PHP]の記事一覧

[symfony][UML]ユースケース図だけで作るシステム開発

2008年01月18日(金)18:09|nasu|FLATzブログ, PHP, プロジェクトマネジメント, 技術情報このエントリをdel.icio.usに追加このエントリをはてなブックマークに追加

那須です


皆さんは開発をする際、きちんと仕様書を書かれていますか?私は、普段開発をする際、きちんとしたドキュメントを作る機会が少なくなっていたのですが、現在手がけているプロジェクトがそこそこの規模を持っており、使い捨て前提のフリーハンドで書いた仕様書だけでは仕様の理解が追いつかなくなっています。


そのため、最近JUDEでユースケース図を描くようにしました。個人的にはユースケース図というと


  • クライアントと認識をあわせるためのツール
  • エンジニアに全体の理解を促すためのツール

という印象で、ユースケース図からユースケースを作り、そこからクラス図などをおこしていくものと考えていました。ですが、今のプロジェクトでは、ユースケース図を使い、そのまま実装レベルで使えるような工夫をしています。今回は、そのことをちょっとまとめておきたいと思います。


前提


応用がきかない場合もあると思いますので、あらかじめ前提を述べておきます。似たような環境でしたら、大丈夫とは思いますが。


  • プログラミング言語: PHP5
  • フレームワーク: Symfony
  • 開発エンジニアは、全員Symfony経験者

ユースケースからプログラム設計へ


ユースケース図


さて、↑のユースケース図は、トラックバック機能を模したユースケース図です。特徴として、ユースケースをパッケージで囲んでいます。このパッケージは、そのままSymfonyのモジュールとなります。そして、ユースケースが アクション(メソッド)となります。と、これだけです。まあ、大したことはないのですが、モジュールとアクションで処理が分別されるようなWebアプリケーションでは、これだけでもかなり有用と考えています。


記号の意味


記号 実装上の意味 備考
パッケージ
(タブのついた長方形)
モジュール
ユースケース
(楕円)
アクション
ユースケース同士の誘導可能関連
(矢印)
Webのリンク TB一覧にTB削除処理に
リンクするボタンがある等を示唆する
ユースケース同士の誘導未定関連
(直線)
関連 ノートなどで関連の意味を示唆し
意味づけをする
依存
(破線矢印)
そのパッケージを利用するアクターを示唆する ※ホントは普通に関連(直線)でやりたかったのですが
アクターとパッケージは関連付けができないための代替策

最後に


とまあ、勝手にユースケースを拡張してWebアプリケーション開発に使いやすいようにしているのですが、いかがでしたでしょうか。他にもモジュール間で”継承”記号を使ったりしているのですが、Symfonyでは、モジュールを継承することがないため、あまり意味を成していません。まだまだ不完全な形ではありますが、現在私が行っている試みとして、ここまでを紹介したいと思います。
超短期開発を求められる場合でも、この程度のドキュメントであればそれほど時間を使わず作ることができるため、これをもっともっと洗練させることで、クライアントとの認識のズレを最小限にしつつ、エンジニアにそのまま開発をしてもらうということができるようにしていきたいと考えています。

続きを読む


[Symfony]DateHelperとDateValidator

2008年01月09日(水)17:00|taniguchi|FLATzブログ, PHP, 技術情報このエントリをdel.icio.usに追加このエントリをはてなブックマークに追加

谷口です。


今回はSymfonyのDateHelperとDateValidatorについて書きます。
DateHelperをtemplateで呼び出すには、input_date_tag関数を使います。
ただ、第3引数’rich=true’を指定するとcalendar widgetが出て日付を指定できますが、
誕生日などの入力には適していないと思います。
‘rich=true’を指定しない場合の例を書きたいと思います。
‘rich=true’を指定しないと、年月日のそれぞれがプルダウンメニューのインプットフォームになります。


DateHelper


例えば、下記のような感じです。


    <?php 
echo
input_date_tag(
ELEMENT_NAME,
DEFAULT_DATE,
array('year_start' => MIN_YEAR, 'year_end' => MAX_YEAR, 'use_month_numbers' => 'true'));
?>

ここで、各引数の説明をします。


  • 第1引数:HTMLのname属性です(フォームから送信されるデータの名前になります)。
  • 第2引数:初期日付
  • 第3引数:オプション

上記サンプルで指定しているオプションは最小年と最大年、月の表示に数字を用いるという設定となります。
最小年・最大年を指定しないと、年の選択範囲が初期日付の5年前~5年後となります。
フォームを送信すると、ELEMENT_NAME[year],ELEMENT_NAME[month],ELEMENT_NAME[day]として送信されます。
ただ、残念ながら、sfDateValidatorはこの形の送信に対して機能しません・・・。
そこで、sfDateValidatorを継承したValidatorクラスを作成します。


DateValidator


上でも記したように、sfDateValidatorはそのままではELEMENT_NAME[year],ELEMENT_NAME[month],ELEMENT_NAME[day]のパラメータを処理できません。下記のようなValidatorを作ってみました。
executeではymlで設定した値を受け取って、指定最大日付と最小日付の間になければ、falseを返します。
また、getValidDateメソッドはstrtotime()関数を使っており、約1902年~2038年は判定できます。
2038年以降または1902年以前を判定したい場合は、独自でメソッドを用意する必要がありますが、
この値をDBに登録する場合、型がDate型でORマッパにPropelを使用している場合、Propelが例外を出しますので注意が必要です。


    <?php 

class myDateValidator extends sfDateValidator
{
public function initialize( $context, $parameters = null )
{
parent::initialize($context);
$this->getParameterHolder()->add($parameters);
return true;
}

public function execute( &$value, &$error )
{
$params = $this->getParameterHolder()->getAll();
$culture = $this->getContext()->getUser()->getCulture();
$input_date = $this->getValidDate(join('-', $value), $culture);
$min_date = $this->getValidDate($params['min'], $culture);
$max_date = $this->getValidDate($params['max'], $culture);

if(empty($input_date)){
$error = $params['error_message'];
return false;
}

if($min_date <= $input_date && $input_date <= $max_date){
return true;
} else {
$error = $params['error_message'];
return false;
}
}
}
?>

validate用のymlは次のような感じです。


    ELEMENT_NAME: 
required: false
validators: v_mydate

v_mydate:
class: myDateValidator
param:
min: "1902-01-01"
max: "2000-12-31"
error_message: "1902年1月1日~2000年12月31日の正しい日付を入力してください"

おわりに


calendar widgetを使えば、こんな面倒なことはしなくても良いのですが、想定される入力値の幅が広いと使い勝手が悪く感じますので、
作ってみました。

続きを読む


Page 5 of 10« First...«34567»...Last »

このページの先頭へ