Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8835

森から木へと向かうコーディング手順

$
0
0

前置き

コーディングの際、個人的には普段から私が実践している方法なのですが
意外と実践していない人を多く見かけるので今回は記事にしてみました。

仮に、商品一覧を表示する画面のサーバーサイドを実装するとします。
仕様書は以下のような、よくある内容のものです。

チェック処理

種別項目内容
必須ユーザーID
必須商品ID
ユーザーID1~3桁
商品ID1~3桁

取得条件

条件テーブルカラム
リクエスト.ユーザーID=ユーザーマスタユーザーID
リクエスト.商品ID=商品マスタ商品ID

さて、このような仕様をソースコードに起こしていくとします。
千差万別だとは思いますが、
みなさんはどういう手順を踏んで実装に移して行きますか?

木から森

まずはよくみかける手順です

①とりあえず処理を羅列

Wood.ts
functiongetProductMaster(userId:number,productId:number){// DBから取得returnproductMaster;}functionmain(userId:number,productId:number){if(!userId){thrownewError();}if(!productId){thrownewError();}if(userId<0||userId>999){thrownewError();}if(productId<0||productId>999){thrownewError();}letproductMaster=this.getProductMaster(userId,productId);returnproductMaster;}

②ソースが長くなってきたところでメソッド化

Wood.ts
functionisValid(userId:number,productId:number):boolean{if(!userId){returnfalse;}if(!productId){returnfalse;}if(userId<0||userId>999){returnfalse;}if(productId<0||productId>999){returnfalse;}returntrue;}functiongetProductMaster(userId:number,productId:number){// DBから取得returnproductMaster;}functionmain(userId:number,productId:number){if(!this.isValid(userId,productId)){thrownewError();}letproductMaster=this.getProductMaster(userId,productId);returnproductMaster;}

これでも悪いというわけではないのですが
今回の場合は、簡単な仕様なので処理の流れの全体像をすぐに把握することができます。

しかし、複雑な仕様をソースに起こしていく場合、
ただ上から順に処理を羅列していくと
ソース量が膨大になってきた時に
ソースコードの全体像が見えなくなり
ソースコードの森の中で迷子になってしまうやもしれません。

これは木から森という、
細かい粒度から大きい粒度の大枠が出来上がっていくために
だんだんと全体像が見えなくなっていき、森の中で迷子になってしまうのです。

そこで今度は処理の順(シーケンシャル)にソースを起こしていくのではなく、
まずは処理全体のアウトラインをつかみ、
先に大枠をソースに起こしておいて
森から木へと、外側から内側方向へとソースを起こしていくようにします。

森から木

①アウトラインだけの中身が空のメソッドを用意して、
処理の全体像を把握しやすくする

Forest.ts
functionisValid(userId:number,productId:number):boolean{// todo: チェック処理returntrue;}functiongetProductMaster(userId:number,productId:number){// DBから取得returnproductMaster;}functionmain(userId:number,productId:number){if(!this.isValid(userId,productId)){thrownewError();}letproductMaster=this.getProductMaster(userId,productId);returnproductMaster;}

②空のメソッドの中身を埋めていく

Forest.ts
functionisValid(userId:number,productId:number):boolean{if(!userId){returnfalse;}if(!productId){returnfalse;}if(userId<0||userId>999){returnfalse;}if(productId<0||productId>999){returnfalse;}returntrue;}functiongetProductMaster(userId:number,productId:number){// DBから取得returnproductMaster;}functionmain(userId:number,productId:number){if(!this.isValid(userId,productId)){thrownewError();}letproductMaster=this.getProductMaster(userId,productId);returnproductMaster;}

こういった書き方をすると、だんだん処理が増えていくうちに
すごい膨大な1メソッドになっちゃった!
ということが自然と防げるために可読性の良いソースになっていきます。

もちろんそれでも単一責任法則を考慮し、
メソッドの債務が重責になってきた際には
後からメソッドの切り出しをしていくことは必要です。


Viewing all articles
Browse latest Browse all 8835

Trending Articles