2016-07-13 5 views
0

現在、私はClean Codeで現在読んでおり、それぞれが独自の「ストーリー」を伝える超小型関数のアイデアが本当に好きです。私はまた、 "TO段落"という言葉でコードをどのように書かなければならないのか、頭の中で一種の名前を "to to"にすることを決めたのが本当に好きです。可読性のためにファンクション内にヘルパー関数をネストする

とにかくより多くの意味のある名前を含むようにコードをリファクタリングし、それを少し読んでいく流れを作り、私は私が確信している何かに遭遇しました。

私は、コードスタイルは非常に議論の余地があり、主観的な話題ですが、うまくいけば、私はこの投稿でうまくいきません。

ありがとうございました!

PSA:現時点ではインターンシップの内部プロジェクトにMEANスタックを使用しているWebアプリケーションを作成しています。

クリーンコードのリファクタリング

//Modal Controller stuff above. vm.task is an instance variable 
vm.task = vm.data.task; 
castTaskDataTypesForForm(); 

    function castTaskDataTypesForForm() { 
    castPriorityToInt(); 
    castReminderInHoursToInt(); 
    castDueDateToDate(); 
    getAssigneObjFromAssigneeString(); 
    } 

    function castPriorityToInt() { 
    vm.task.priority = vm.task.priority === undefined ? 
     0 : parseInt(vm.task.priority); 
    } 

    function castReminderInHoursToInt() { 
    vm.task.reminderInHours = vm.task.reminderInHours === undefined ? 
     0 : parseInt(vm.task.reminderInHours); 
    } 

    function castDueDateToDate() { 
    vm.task.dueDate = new Date(vm.task.dueDate); 
    } 

    function getAssigneObjFromAssigneeString() { 
    vm.task.assignee = getUserFromId(vm.task.assignee); 
    } 

おそらくより良いリファクタリング? /私の質問----------------------------

//Modal Controller stuff above. vm.task is an instance variable 
vm.task = vm.data.task; 
castTaskDataTypesForForm(); 

    function castTaskDataTypesForForm() { 
    castPriorityToInt(); 
    castReminderInHoursToInt(); 
    castDueDateToDate(); 
    getAssigneObjFromAssigneeString(); 

    function castPriorityToInt() { 
     vm.task.priority = vm.task.priority === undefined ? 
     0 : parseInt(vm.task.priority); 
    } 

    function castReminderInHoursToInt() { 
     vm.task.reminderInHours = vm.task.reminderInHours === undefined ? 
     0 : parseInt(vm.task.reminderInHours); 
    } 

    function castDueDateToDate() { 
     vm.task.dueDate = new Date(vm.task.dueDate); 
    } 

    function getAssigneObjFromAssigneeString() { 
     vm.task.assignee = getUserFromId(vm.task.assignee); 
    } 
    } 
+0

メイン関数が呼び出されるたびに再作成されるので、関数内でヘルパーを定義しない方がよいでしょう。アーキテクチャに応じて、最初の例と同じスコープで非表示にします。または、IIFEを使用して、その周囲にクロージャを作成して、ヘルパーをプライベートにすることができます。または、メイン関数を含むモジュールのプロトタイプに置きます(存在する場合)。残りのコードの構造を知らなければ、私はIIFEのために行きます。 – Shilly

+0

素晴らしい、私に調べる何かを与えてくれてありがとう! IIFEのことを聞いたことはありません。彼らに私のために何があるのか​​を見てみましょう。 また、これが使用されている方法とそれのアーキテクチャのために、これは一度だけ呼び出せます。だから彼らが再現されている限り、それは問題ではありません。 – Michael

+0

@ Shillyあなたが必要な場合は、これを回答として投稿し、私はそれを受け入れます。 – Michael

答えて

0

ここにIIFEの例を掲載すると、私はより多くの作業の余地があります。私はこれが最善の選択肢であると言っているわけではありません。それは、OPが私たちに与えた情報で使用するものです。

var castTaskDataTypesForForm = (function() { 
    var castPriorityToInt = function castPriorityToInt() { ... }, 
     castReminderInHoursToInt = function castReminderInHoursToInt() { .. }, 
     castDueDateToDate = function castDueDateToDate() { ... }, 
     getAssigneObjFromAssigneeString = function getAssigneObjFromAssigneeString() { ... }; 
    return function castTaskDataTypesForForm() { 
     castPriorityToInt(); 
     castReminderInHoursToInt(); 
     castDueDateToDate(); 
     getAssigneObjFromAssigneeString(); 
    }; 
}()); 
vm.task = vm.data.task; 
castTaskDataTypesForForm(); 

このようにして、ヘルパー関数は一度しか定義されず、閉じた内部でプライベートに保たれます。関数x()スタイルが好きな場合は、var x = function x構文をobvで削除できます。

編集:関数が一度しか呼び出されない場合は、独自の例がおそらくよりクリーンなコードになります。 IIFEの構文を使用する理由は、ヘルパー関数を自分の2番目の例のようにmain関数でのみアクセスできるようにするためです。

+0

非常に興味深い、ええ私はちょうどそれについての記事を読んで、それを行うための別の方法は、文字通り括弧でそれを包むことになると思われる。コメントを残したままの神の中にいるので、私は毛羽立たせたくないですが、 (function castTaskDataTypesForForm(){...}()); これはややうまく機能しました。あなたがそれをやっているやり方は、多かれ少なかれ同じことです...そうですか? 明示的に関数を呼び出す方法は好きですが、関数を呼び出しの前に定義する必要がありますか? – Michael

+1

私はむしろこれのために関数式を使用したくないでしょう。正規の関数を使用すると、読みやすくなりますが、愚かな構文エラーは少なくなりますが、それでも正しくスコープされます。 – slebetman

+0

@slebetman私は同意する、私は関数式の巨大なファンでもない。あなたが話していることについて私がコメントしていることは何ですか? (関数castTaskDataTypesForForm(){...}()); – Michael

0

MEANjsは時には2番目の方法を使用します(コールバックなど) 。私は個人的には、あなたが主な機能の外でそれらのヘルパーを使用するつもりがないなら、それはいいと思う。

+0

返事をありがとう、ええ、私は@ Shillyと一緒に考えれば、彼らが再作成されるかどうかを考慮に入れた答えが、まさに私が探していたものだと思います。 – Michael

関連する問題