エレガントなコードの書き方 その1
最近、こーゆーダサいコードを目にするようになりました...


# Source 1:エレガントでないコード

h_file = open( "/home/hoge/fuga.txt" ) ;
if( h_file == null )
{
  print( "File Open Failed!" ) ;
  return false ;
}

if( check_A() == false )
{
  print( "Check A Failed!" ) ;
  return false ;
}

if( check_B() == false )
{
  print( "Check B Failed!" ) ;
  return false ;
}

if( DoIT( h_file ) == false )
{
  print( "File Process Failed!" ) ;
  return false ;
}

close( h_file ) ;
print( "Success!" ) ;
return true ;



なんでだろうなと不思議だったんだけれども、どうもこの本が原因だったみたいです。

















この本自体買って読んだわけではないのですが、書いていることは同意できる内容や
実際に自分が実践している内容も含まれるようです。
良書と言って差し支えないでしょう。

ただし「ネストを浅くする」「ガード節」と書かれた箇所をちぎって捨てれば

続きも含めて全7回。大したこと言いたい訳でもないのにずいぶん長くなったな...

続きを読む
【2015/10/18】 エレガントコード | トラックバック(0) | コメント(2) | page top↑
エレガントなコードの書き方 その2
▼ 大きな利点:リソースリークが減らせる

まず、前回の Source 1 には意図的にバグを含めています。

バグを無くしたコードはこんな感じ。


# Source 3:Source 1 のコードを修正したコード

h_file = open( "/home/hoge/fuga.txt" ) ;
if( h_file == null )
{
  print( "File Open Failed!" ) ;
  return false ;
}

if( check_A() == false )
{
  print( "Check A Failed!" ) ;
  close( h_file ) ;
  return false ;
}

if( check_B() == false )
{
  print( "Check B Failed!" ) ;
  close( h_file ) ;
  return false ;
}

if( DoIT( h_file ) == false )
{
  print( "File Process Failed!" ) ;
  close( h_file ) ;
  return false ;
}

close( h_file ) ;
print( "Success!" ) ;
return true ;



すべての準正常処理に close() 入れるとか、はっきり言ってダサいですよねw

ダサいだけではなくて、すべての準正常処理にリソース開放処理を入れなければならない
とゆーことは、リソース開放処理の入れ忘れも起こりやすいとゆーことです。

続きを読む
【2015/10/19】 エレガントコード | トラックバック(0) | コメント(0) | page top↑
エレガントなコードの書き方 その3
▼ 精神的スタックってなんなんだよw

例の本には
ネストを深くすると、精神的スタックが増えて読みづらくなる
って趣旨のことが書いてあるらしいですが、本当に読みづらくなるんでしょうか?


# Source 4:エレガントでない Source 3 とほぼ等価なコード

reason = "File Open Failed!"
h_file = open( "/home/hoge/fuga.txt" ) ;
if( h_file == null ||
  check_A( &reason ) == false ||
  check_B( &reason ) == false ||
  DoIT( h_file, &reason ) == false )
{
  print( reason ) ;
  return false ;
}
close( h_file ) ;
print( "Success!" ) ;
return true ;




# Source 5:エレガントな Source 2 とほぼ等価なコード

reason = "File Open Failed!"
h_file = open( "/home/hoge/fuga.txt" ) ;
if( h_file != null &&
  check_A( &reason ) == true &&
  check_B( &reason ) == true &&
  DoIT( h_file, &reason ) == true )
{
  print( "Success!" ) ;
  rc = true
}
else
{
  print( reason ) ;
}
close( h_file ) ;
return rc ;



どちらも、本質的には if 文一つにまとめることができます。
#よいこはマネしないで!
違いは、条件を or で繋いでいるのか and で繋いでいるのかの違いです。

続きを読む
【2015/10/20】 エレガントコード | トラックバック(0) | コメント(3) | page top↑
エレガントなコードの書き方 その4
▼ エレガントなコードの方が見やすい。

それでもエレガントな書き方だとネスト深くなって見づらいじゃん!

って反応があると思いますが、こんなのは
横長のディスプレイを買うカネも無いような貧乏人のしみったれた発想
であって、必要な道具に高々数万円程度のモノをケチっていては
プロとは言えないでしょう。

そんなのエコじゃない!って言うなら、
まあ適宜別のメソッドに切り出せば良くね? ってことでw

エレガントなコードの書き方の利点としてもう一つ。
正常処理と準正常処理が分離されるとゆーのがあります。
もう一度 Source 2 を見てみましょうか。


# Source 2:エレガントなコード

# 正常処理 ここから ---->
rc = false ;
h_file = open( "/home/hoge/fuga.txt" ) ;
if( h_file != null )
{
  if( check_A() == true )
  {
    if( check_B() == true )
    {
      rc = DoIT( h_file ) ;
      if( rc == true )
      {
        print( "Success!" ) ;
      }
# <---- 正常処理 ここまで
      else
# 準正常処理 ここから ---->
      {
        print( "File Process Failed!" ) ;
      }
    }
    else
    {
      print( "Check B Failed!" ) ;
    }
  }
  else
  {
    print( "Check A Failed!" ) ;
  }
  close( h_file ) ;
}
else
{
  print( "File Open Failed!" ) ;
}
# <---- 準正常処理 ここまで
return rc ;



と、こんな感じで正常処理と準正常処理が分かれます。
続きを読む
【2015/10/21】 エレガントコード | トラックバック(0) | コメント(0) | page top↑
エレガントなコードの書き方 その5
▼ 弱点も無い訳じゃない。

ここまで読んで頂いて...
バグも減らせて見やすくなるなんて、エレガントな書き方いいね!
と思ってくれる人もいるとは思いますが、弱点が無い訳でもないです。

具体的にはこんな構造。


# check_A() が false の時は true。
# check_A() が true の時、check_B() が true なら true。false なら false。
if( check_A() == true )
{
  if( check_B() == true )
  {
    print( "Success!" ) ;
# ここに正常系処理が入る。
    return true ;
  }
  else
  {
    print( "Failed!" ) ;
# ここに準正常系処理が入る。
    return false ;
  }
}
else
{
  print( "Success!" ) ;
# ここにも正常系処理が入ってしまう!。エレガントじゃない!
  return true ;
}



つまりは、正常系が二手に分かれてしまうパターン。ありがちですねw

続きを読む
【2015/10/22】 エレガントコード | トラックバック(0) | コメント(0) | page top↑
| ホーム | OLD