SlideShare a Scribd company logo
1 of 53
Download to read offline
入れ子構造を分解する

Perl Beginners #5 LT
高橋メソッド大好きな

  ytnobodyが
高橋メソッドで

お送りします。
さて
こういうコードに

出くわしたことは
ありませんか?
sub register {
  my ( $name, $mail ) = @_;
  if ( $name ) {
      if ( length $name > 1 ) {
          if ( length $name <= 12 ) {
          }
          else {
             die “name is too long”;
          }
      }
      else {
          die “name is too short”;
      }
  }
  else {
      die “name is required”;
  }
  if ( $mail ) {
      if ( $mail =~ /^.+@.+..+$/ ) {
      }
      else {
          die “specified mail is not legal”;
      }
  }
  else {
      die “mail is required”;
  }
  if ( $name && $mail ) {
      print “name: $namenmail: $mailn”;
  }
}
読む気が失せましたよね
コード内の入れ子構造(ネスト)が

     多すぎる
まずロジックを整理。
やりたいこと
$mailは
$nameがない旨                 メアドとして       $mailがメアドでは
 を警告し終了      $nameがある                  ない旨を警告し終了
                            正しい



$nameが短すぎる    $nameが    $nameと$mailを
 旨を警告し終了     1文字より長い    名前とメアドとして
                           出力する



$nameが長すぎる    $nameが
 旨を警告し終了     12文字以内



$mailがない旨    $mailがある
 を警告し終了
だいぶ煩雑
シンプルにできないか。
条件を統合・省略してみよう
$nameが       $nameが短すぎる
1文字~12文字        旨を警告し終了




   $mailは      $mailがメアドでは
  メアドとして       ない旨を警告し終了
    正しい



$nameと$mailを
名前とメアドとして
   出力する
コードに起こしてみる
sub register {
  my ( $name, $mail ) = @_;
  if ( length $name > 1 && length $name <= 12 ) {
  }
  else {
     die “name is 1 to 12 characters longer”;
  }
  if ( $mail =~ /^.+@.+..+$/ ) {
  }
  else {
      die “specified mail is not legal”;
  }
  print “name: $namenmail: $mailn”;
}
多少マシになった
でもまだ荒い。
条件に合致しなかったときにだけ

    エラーを吐こう
sub register {
  my ( $name, $mail ) = @_;
  unless ( length $name > 1 && length $name <= 12 ) {
     die “name is 1 to 12 characters longer”;
  }
  unless ( $mail =~ /^.+@.+..+$/ ) {
     die “specified mail is not legal”;
  }
  print “name: $namenmail: $mailn”;
}
まあまあよくなった
でもまだ問題が。
例えば、$nameのチェック部分や

   $mailのチェック部分
ほかの場所でも同じような

 チェックをする場合
どうする・・・
チェック部分を

別の関数として切り出そう
sub validate_name {
  my $name = shift;
  return length $name > 1 && length $name <= 12 ;
}

sub validate_mail {
  my $mail = shift;
  return $mail =~ /^.+@.+..+$/;
}

sub register {
  my ( $name, $mail ) = @_;
  unless ( validate_name( $name ) ) {
     die “name is 1 to 12 characters longer”;
  }
  unless ( validate_mail( $mail ) ) {
     die “specified mail is not legal”;
  }
  print “name: $namenmail: $mailn”;
}
一見冗長
だけど、validate_name() や

validate_mail() を呼ぶだけで

チェックができるようになった
でも冗長
後置条件にしてみる
sub validate_name {
  my $name = shift;
  return length $name > 1 && length $name <= 12 ;
}

sub validate_mail {
  my $mail = shift;
  return $mail =~ /^.+@.+..+$/;
}

sub register {
  my ( $name, $mail ) = @_;
  die “name is 1 to 12 characters longer” unless validate_name( $name );
  die “specified mail is not legal” unless validate_mail( $mail );
  print “name: $namenmail: $mailn”;
}
ちょっとスッキリした。
dieとか毎回書くの億劫
チェック側にdieもやらせよう
sub validate_name {
  my $name = shift;
  die “name is 1 to 12 characters longer” unless
     length $name > 1 && length $name <= 12
  ;
}

sub validate_mail {
  my $mail = shift;
  die “specified mail is not legal” unless
     $mail =~ /^.+@.+..+$/
  ;
}

sub register {
  my ( $name, $mail ) = @_;
  validate_name( $name );
  validate_mail( $mail );
  print “name: $namenmail: $mailn”;
}
さらに

$nameのチェックと

$mailのチェックを

   まとめる
sub validate_name {
  my $name = shift;
  die “name is 1 to 12 characters longer” unless
     length $name > 1 && length $name <= 12
  ;
}

sub validate_mail {
  my $mail = shift;
  die “specified mail is not legal” unless
     $mail =~ /^.+@.+..+$/
  ;
}

sub validate {
  my ( $mail, $name );
  validate_name( $name );
  validate_mail( $mail );
}

sub register {
  my ( $name, $mail ) = @_;
  validate( $name, $mail );
  print “name: $namenmail: $mailn”;
}
ほかの場所からでも

$validateを呼ぶだけで

  $nameと$mailを

   チェックできる
うわあ!

仕様変更だ!
単純にprintしていただけの箇所を

DB登録するようにしろ、だって?!
よし!
その部分をほかのヤツに

   やらせよう
そのために

printしているところは

 関数にしておこう
sub validate_name {
  my $name = shift;
  die “name is 1 to 12 characters longer” unless
     length $name > 1 && length $name <= 12
  ;
}

sub validate_mail {
  my $mail = shift;
  die “specified mail is not legal” unless
     $mail =~ /^.+@.+..+$/
  ;
}

sub validate {
  my ( $mail, $name );
  validate_name( $name );
  validate_mail( $mail );
}

sub register {
  my ( $name, $mail ) = @_;
  validate( $name, $mail );
  insert_to_db( $name, $mail );
}

sub insert_to_db {
  print “name: $namenmail: $mailn”;
  ### ここにDBへの登録ロジックを書いてくれたまえ!
}
まとめ
何が言いたかったのか
●   関数内の入れ子(ネスト)が深くなったなら、それは
    よくない。
    ●
        入れ子の部分を別の関数に切り出そう
        –   でかい関数1個よりも、小さい関数の組み合わせで。
        –   入れ子が3階層になったら、ちょっとヤバ目。
            ●   人によっては2階層で、という方も居るし、共感できます。
    ●   まとめれるif文はどんどんまとめよう
何が言いたかったのか
●   関数内の行数が長くなってきたら、それはよくな
    い。
    ●
        入れ子になって無くても、大抵は別の関数として切り出
        せる場所がある。
        –   関数内のコードが10行超えたら、個人的にはちょっとよくない
            と思い始める。
            ●   でも仕事のコードで10行超えの関数がちょいちょいある。
            ●
                自戒。
何が言いたかったのか
●   関数の処理を、簡単な関数名で表現できないのは
    よくない。
    ●
        大体関数内のコードが長い場合に起こる。
        –   どこか切り出すべき処理があるはず。
何が言いたかったのか
●   小さい関数に切り出すことで、仕様変更に強くな
    れ!
    ●
        使いまわしがきくようになる
    ●   テストもしやすい
ありがとうございました

More Related Content

Viewers also liked

Gmm 17 gennaio 2016 ita
Gmm 17 gennaio 2016 itaGmm 17 gennaio 2016 ita
Gmm 17 gennaio 2016 itaMaike Loes
 
Social Media Marketing Solution for Dentists
Social Media Marketing Solution for DentistsSocial Media Marketing Solution for Dentists
Social Media Marketing Solution for Dentistssocialraver
 
Animatore missionario-4.2015-ok-web
Animatore missionario-4.2015-ok-webAnimatore missionario-4.2015-ok-web
Animatore missionario-4.2015-ok-webMaike Loes
 
Bautismo del señor
Bautismo del señorBautismo del señor
Bautismo del señorMaike Loes
 
Presentation alevel work max
Presentation alevel work maxPresentation alevel work max
Presentation alevel work maxstoliros
 
Ray hagen ppt for linked in feb 2014
Ray hagen ppt for linked in feb 2014Ray hagen ppt for linked in feb 2014
Ray hagen ppt for linked in feb 2014Ray Hagen
 
Sussidio giovani poim-gmr-2015-2016-digiciano(2)
Sussidio giovani poim-gmr-2015-2016-digiciano(2)Sussidio giovani poim-gmr-2015-2016-digiciano(2)
Sussidio giovani poim-gmr-2015-2016-digiciano(2)Maike Loes
 
Diabetes 2011, Spring Seminar
Diabetes 2011, Spring  SeminarDiabetes 2011, Spring  Seminar
Diabetes 2011, Spring SeminarSonja Upham
 
Imovie tutorial
Imovie tutorial Imovie tutorial
Imovie tutorial stoliros
 
Study space times
Study space timesStudy space times
Study space timesstoliros
 
Leading research in technoscience institutttseminar-281010
Leading research in technoscience institutttseminar-281010Leading research in technoscience institutttseminar-281010
Leading research in technoscience institutttseminar-281010NTNU
 
Photoshop tutorial
Photoshop tutorial Photoshop tutorial
Photoshop tutorial stoliros
 

Viewers also liked (19)

Mantra rus
Mantra rusMantra rus
Mantra rus
 
Gmm 17 gennaio 2016 ita
Gmm 17 gennaio 2016 itaGmm 17 gennaio 2016 ita
Gmm 17 gennaio 2016 ita
 
Social Media Marketing Solution for Dentists
Social Media Marketing Solution for DentistsSocial Media Marketing Solution for Dentists
Social Media Marketing Solution for Dentists
 
Animatore missionario-4.2015-ok-web
Animatore missionario-4.2015-ok-webAnimatore missionario-4.2015-ok-web
Animatore missionario-4.2015-ok-web
 
Bautismo del señor
Bautismo del señorBautismo del señor
Bautismo del señor
 
Presentation alevel work max
Presentation alevel work maxPresentation alevel work max
Presentation alevel work max
 
Ray hagen ppt for linked in feb 2014
Ray hagen ppt for linked in feb 2014Ray hagen ppt for linked in feb 2014
Ray hagen ppt for linked in feb 2014
 
Sussidio giovani poim-gmr-2015-2016-digiciano(2)
Sussidio giovani poim-gmr-2015-2016-digiciano(2)Sussidio giovani poim-gmr-2015-2016-digiciano(2)
Sussidio giovani poim-gmr-2015-2016-digiciano(2)
 
Diabetes 2011, Spring Seminar
Diabetes 2011, Spring  SeminarDiabetes 2011, Spring  Seminar
Diabetes 2011, Spring Seminar
 
Febbraio
FebbraioFebbraio
Febbraio
 
Ppt voorprogrammas
Ppt voorprogrammasPpt voorprogrammas
Ppt voorprogrammas
 
Imovie tutorial
Imovie tutorial Imovie tutorial
Imovie tutorial
 
Novembre 2011
Novembre 2011Novembre 2011
Novembre 2011
 
Study space times
Study space timesStudy space times
Study space times
 
Leading research in technoscience institutttseminar-281010
Leading research in technoscience institutttseminar-281010Leading research in technoscience institutttseminar-281010
Leading research in technoscience institutttseminar-281010
 
Vlada menshosti
Vlada menshostiVlada menshosti
Vlada menshosti
 
CASA ALEGRE TERRASSA
CASA ALEGRE TERRASSACASA ALEGRE TERRASSA
CASA ALEGRE TERRASSA
 
Photoshop tutorial
Photoshop tutorial Photoshop tutorial
Photoshop tutorial
 
media and scientific temper
media and scientific tempermedia and scientific temper
media and scientific temper
 

More from azuma satoshi

finally (not finally)
finally (not finally)finally (not finally)
finally (not finally)azuma satoshi
 
時を駆けるINSERT.pptx
時を駆けるINSERT.pptx時を駆けるINSERT.pptx
時を駆けるINSERT.pptxazuma satoshi
 
できる!サーバレスアーキテクチャ
できる!サーバレスアーキテクチャできる!サーバレスアーキテクチャ
できる!サーバレスアーキテクチャazuma satoshi
 
印刷に耐えられる品質のQRCodeをPerlで生成したよ! - Mishima.pm #1
印刷に耐えられる品質のQRCodeをPerlで生成したよ! - Mishima.pm #1印刷に耐えられる品質のQRCodeをPerlで生成したよ! - Mishima.pm #1
印刷に耐えられる品質のQRCodeをPerlで生成したよ! - Mishima.pm #1azuma satoshi
 
Perlbeginnes 9 lt_ytnobody
Perlbeginnes 9 lt_ytnobodyPerlbeginnes 9 lt_ytnobody
Perlbeginnes 9 lt_ytnobodyazuma satoshi
 
Perlbeginnes 9 opening
Perlbeginnes 9 openingPerlbeginnes 9 opening
Perlbeginnes 9 openingazuma satoshi
 
Perlbeginners proposal
Perlbeginners proposalPerlbeginners proposal
Perlbeginners proposalazuma satoshi
 
YAPC::Asia 2012 CPANに恩返ししよう
YAPC::Asia 2012 CPANに恩返ししようYAPC::Asia 2012 CPANに恩返ししよう
YAPC::Asia 2012 CPANに恩返ししようazuma satoshi
 
ライブコーディング(?)で学ぶPerlオブジェクト指向
ライブコーディング(?)で学ぶPerlオブジェクト指向ライブコーディング(?)で学ぶPerlオブジェクト指向
ライブコーディング(?)で学ぶPerlオブジェクト指向azuma satoshi
 
Perlbeginnes 4 keynote
Perlbeginnes 4 keynotePerlbeginnes 4 keynote
Perlbeginnes 4 keynoteazuma satoshi
 
Perl暦およそ10年(?)の僕がデータベースを使えるようになるまでの昔話
Perl暦およそ10年(?)の僕がデータベースを使えるようになるまでの昔話Perl暦およそ10年(?)の僕がデータベースを使えるようになるまでの昔話
Perl暦およそ10年(?)の僕がデータベースを使えるようになるまでの昔話azuma satoshi
 
Perlbeginners 3 opening talk
Perlbeginners 3 opening talkPerlbeginners 3 opening talk
Perlbeginners 3 opening talkazuma satoshi
 
Perlbeginnes 2 keynote
Perlbeginnes 2 keynotePerlbeginnes 2 keynote
Perlbeginnes 2 keynoteazuma satoshi
 
Perl Beginners #1 keynote
Perl Beginners #1 keynotePerl Beginners #1 keynote
Perl Beginners #1 keynoteazuma satoshi
 
大ざっぱにオブジェクト指向
大ざっぱにオブジェクト指向大ざっぱにオブジェクト指向
大ざっぱにオブジェクト指向azuma satoshi
 

More from azuma satoshi (20)

finally (not finally)
finally (not finally)finally (not finally)
finally (not finally)
 
時を駆けるINSERT.pptx
時を駆けるINSERT.pptx時を駆けるINSERT.pptx
時を駆けるINSERT.pptx
 
できる!サーバレスアーキテクチャ
できる!サーバレスアーキテクチャできる!サーバレスアーキテクチャ
できる!サーバレスアーキテクチャ
 
印刷に耐えられる品質のQRCodeをPerlで生成したよ! - Mishima.pm #1
印刷に耐えられる品質のQRCodeをPerlで生成したよ! - Mishima.pm #1印刷に耐えられる品質のQRCodeをPerlで生成したよ! - Mishima.pm #1
印刷に耐えられる品質のQRCodeをPerlで生成したよ! - Mishima.pm #1
 
L tthon
L tthonL tthon
L tthon
 
Perlbeginnes 9 lt_ytnobody
Perlbeginnes 9 lt_ytnobodyPerlbeginnes 9 lt_ytnobody
Perlbeginnes 9 lt_ytnobody
 
Perlbeginnes 9 opening
Perlbeginnes 9 openingPerlbeginnes 9 opening
Perlbeginnes 9 opening
 
Perlbeginners proposal
Perlbeginners proposalPerlbeginners proposal
Perlbeginners proposal
 
Chibapm01 lt
Chibapm01 ltChibapm01 lt
Chibapm01 lt
 
YAPC::Asia 2012 CPANに恩返ししよう
YAPC::Asia 2012 CPANに恩返ししようYAPC::Asia 2012 CPANに恩返ししよう
YAPC::Asia 2012 CPANに恩返ししよう
 
ライブコーディング(?)で学ぶPerlオブジェクト指向
ライブコーディング(?)で学ぶPerlオブジェクト指向ライブコーディング(?)で学ぶPerlオブジェクト指向
ライブコーディング(?)で学ぶPerlオブジェクト指向
 
Perlbeginnes 4 keynote
Perlbeginnes 4 keynotePerlbeginnes 4 keynote
Perlbeginnes 4 keynote
 
Perl暦およそ10年(?)の僕がデータベースを使えるようになるまでの昔話
Perl暦およそ10年(?)の僕がデータベースを使えるようになるまでの昔話Perl暦およそ10年(?)の僕がデータベースを使えるようになるまでの昔話
Perl暦およそ10年(?)の僕がデータベースを使えるようになるまでの昔話
 
Perlbeginners 3 opening talk
Perlbeginners 3 opening talkPerlbeginners 3 opening talk
Perlbeginners 3 opening talk
 
PSGIへの誘い
PSGIへの誘いPSGIへの誘い
PSGIへの誘い
 
Perlbeginnes 2 keynote
Perlbeginnes 2 keynotePerlbeginnes 2 keynote
Perlbeginnes 2 keynote
 
Hachiojipm 14 LT
Hachiojipm 14 LTHachiojipm 14 LT
Hachiojipm 14 LT
 
Perl Beginners #1 keynote
Perl Beginners #1 keynotePerl Beginners #1 keynote
Perl Beginners #1 keynote
 
大ざっぱにオブジェクト指向
大ざっぱにオブジェクト指向大ざっぱにオブジェクト指向
大ざっぱにオブジェクト指向
 
Hachioji.pm #13 LT
Hachioji.pm #13 LTHachioji.pm #13 LT
Hachioji.pm #13 LT
 

入れ子構造を分解する