どのように関数を編纂します(続き)----《コードのきれいな道》読書ノート

1901 ワード

(markdownを使用してレイアウトした後に再送する)関数に関する前の記事には、関数を記述するためのいくつかの注意事項が書かれています.
  • 関数は短くします.
  • 関数は1つのことしかできません.
  • 関数のパラメータはできるだけ少なくし、出力関数を使用しないでください.
  • 関数は副作用がありません.
  • 関数は、命令と問合せを区別します.
  • 本編では、関数に関する他の知識を書きます.
    識別子パラメータが関数に渡されないようにします.識別子はtrueまたはfalseです.識別子パラメータは、関数が少なくとも2つのことをしなければならないことを意味します.true、1つのことをします.false、別のことをします.私のコード、他の同僚のコードは、識別子をパラメータとする関数の数は、よくあります.関数から識別を除去する場合は、関数の数を増やします.さらに、関数内の識別子によってもたらされるif...else...構造は、関数の外に移行する.これはメリットがないようだ.
    命令型関数は、ステータスコードの代わりに異常処理を使用して返されます.コードAを参照してください.
    if(deleteUserById(id) === ERROR_CODE){
        if(deleteUserFriendById(id) === ERROR_CODE){
            return true;
        }else{
            log(errorMsg);
        }
    }else{
       log(errorMsg); 
    }
    
    deleteUserById(id)deleteUserFriendById(id)はいずれも命令型関数である.上のコードをコードBに改造する.
    try{
        deleteUserById(id);
        deleteUserFriendById(id);
    }catch(Exception e){
        log(e);
    }
    

    コードBはかなり簡潔になっていますが、私にはわかりません.異なる関数から放出される異常は異なり、異常を捉えて処理するコードも異なる可能性があります.異なるコードに対して、異なる処理を行う必要がある場合は、関数内部にカプセル化されたコードを理解しなければなりません.これは「オープン---クローズ」に反します.原則.仕事は今まで、私は何回かこのようなエラーを処理する方法しか使いませんでした.関数の内部に深く入り込んで投げ出された異常状況を理解する必要があります.私がこの方法を使わない理由です.しかし、この方法は専門家が提唱したもので、私はゆっくり考えなければなりません.そのすばらしさを理解するまで.
    コードBは、さらにコードCに書き換えることができる.
    try{
        deleteUserAndFriendById(id);
    }catch(Exception e){
        log(e);
    }
    
    function deleteUserAndFriendById(id){
        deleteUserById(id);
        deleteUserFriendById(id);
    }
    

    コードBからコードCまで、関数を記述するもう一つの原則に従っています.他の大きなコードの醜いtry...catchから剥離します.なぜこのようにするのかというと、簡潔さ以外に、他の原因は考えられません.
    関数の名前は、動詞または動詞のフレーズ+名詞の形式を使用する必要があります.たとえば、write(name)は、良い関数名です.
    今日の金曜日、怠けて、昼はずっとアニメを見ていて、書いていません.
    同僚は先日markdownを使って書くことを推薦して、今日試してみました.私はすべてのmarkdownの技巧を掌握していませんが、少し運用して、多くのメリットがあります:レイアウトは少しきれいで、特にコードのレイアウトです.