Explaining Variables
coding主要的主軸是readable, 其餘都是次要的, 而利用額外的變數, 來解釋某個較小的表示式, 就被稱為"explaining variable". 比如username = line.split(':')[0].strip() if username == "root": 會比下面這行容易理解 if line.split(':')[0].strip() == "root": 上面的username就被稱為"explaining variable"
Summary Variables
利用額外的變數, 來解釋某個表示式, 稱為"Summary Variables", 比如final boolean user_owns_document = (request.user.id == document.owner_id); if (user_owns_document) { // user can edit this document... } 這裡的user_owns_document就被稱為Summary Variables, 當然你也可以不斷的使用(request.user.id == document.owner_id)
Using De Morgan’s Laws
1) not (a or b or c) ⇔ (not a) and (not b) and (not c)2) not (a and b and c) ⇔ (not a) or (not b) or (not c)
我們可以多利用Morgan’s Laws簡化一些判斷式, 當然一切還是以readable為前提, 比如
if (!file_exists || is_protected) Error("Sorry, could not read file."); 會比下面這行容易理解 if (!(file_exists && !is_protected)) Error("Sorry, could not read file.");
Finding a More Elegant Approach
有時候我們反向思考可以找到更好的// Check if 'begin' or 'end' falls inside 'other'. bool Range::OverlapsWith(Range other) { return (begin >= other.begin && begin lt; other.end) || (end > other.begin && end lt;= other.end) } 換個方式寫會更好閱讀 bool Range::OverlapsWith(Range other) { if (other.end <= begin) return false; // They end before we begin if (other.begin >= end) return false; // They begin after we end return true; // Only possibility left: they overlap }
Simplify Expressions
有時候我們可以用MARCO增加閱讀性, 比如void AddStats(const Stats& add_from, Stats* add_to) { #define ADD_FIELD(field) add_to->set_##field(add_from.field() + add_to->field()) ADD_FIELD(total_memory); ADD_FIELD(free_memory); ADD_FIELD(swap_memory); ADD_FIELD(status_string); ADD_FIELD(num_processes); ... #undef ADD_FIELD } 比下面這例子容易閱讀 void AddStats(const Stats& add_from, Stats* add_to) { add_to->set_total_memory(add_from.total_memory() + add_to->total_memory()); add_to->set_free_memory(add_from.free_memory() + add_to->free_memory()); add_to->set_swap_memory(add_from.swap_memory() + add_to->swap_memory()); add_to->set_status_string(add_from.status_string() + add_to->status_string()); add_to->set_num_processes(add_from.num_processes() + add_to->num_processes()); ... }
coding主要的主軸是readable, 其餘都是次要的, 而利用額外的變數, 來解釋某表示式, 或利用MACRO更容易閱讀, 以及換個方式寫, 都是手段
-
參考資料:
- The Art of Readable Code
沒有留言:
張貼留言