2. Kotexcode: DRY
kotexcode
3
DRY
1
WET
1
White

quocnguyen viết ngày 26/05/2016

alt text

Một lập trình viên đúng nghĩa nếu có thể chỉ viết 1 dòng code, tuyệt đối sẽ không viết 2 dòng.

( trừ khi viết 2 dòng dễ đọc hơn hehe đừng code tỏ vẻ thông minh hay nguy hiểm, tôi chê, ai code dễ đọc là tôi ưng )

Bài này sẽ nói về 1 sai lầm nhiều người gặp phải vì chưa nghiên cứu qua kotexcode.

KotexCode là phải DRY ( khô thoáng ). Không khô bán chó nó mua ! ơ kìa !

Vì lười, chúng ta sẽ lấy lại cái ví dụ ở bài trước:


public function doLogin() {

    if (empty($_POST['username'])) {
        $this->error = 'username should not be blank';
        return false;
    }

    if (empty($_POST['password'])) {
        $this->error = 'password should not be blank';
        return false;
    }

    if ( ! Auth::validate($_POST['username'], $_POST['password'])) {
        $this->error = 'username or password incorect';
        return false;
    }

    // chay toi day la ngon roi =))
    return true;
}

Giả sử một ngày xấu trời, boss vào văn phòng mở máy lạnh và nằm mơ, thấy bụt hiện ra.

Bụt: “Con có biết tại sao doanh thu tháng này giảm không?”

Boss: “Biết đéo đâu ?”

Bụt nghe vậy giận lắm, nhưng vẫn cười đểu giải thích: “Doanh thu giảm là tại vì mày bắt user phải login bằng username, ở cái nước việt nam này có mấy ai dùng danh tính thật ? mổi lần vô web tụi user nó lại nghĩ ra 1 cái username mới lạ rồi mấy hôm sau tụi nó quên username, lúc đó lấy gì login vào web của mày ?”

Boss: “DM, ra vậy”

Sau đấy boss bắt chúng ta code lại function doLogin, lần này phải cho user có thể login bằng email hay username đều được.

Có bạn sẽ nói dễ quá, viết 2 function mới, doLoginWithUsernamedoLoginWithEmail, rồi trong function doLogin kiểm tra xem thằng user nó post lên cái gì thì gọi function tương ứng, code chúng ta sẽ trở thành thế này.


    public function doLogin() {
        if (is_email($_POST['username'])) {
            return doLoginWithEmail($_POST['username'], $_POST['password']);
        }

        return doLoginWithUsername($_POST['username'], $_POST['password']);
    }

    private function doLoginWithUsername($username, $password) {

        if (empty($username)) {
            $this->error = 'username should not be blank';
            return false;
        }

        if (empty($password)) {
            $this->error = 'password should not be blank';
            return false;
        }

        if ( ! Auth::attempt(array('username' => $username, 'password' => $password))) {
            $this->error = 'username or password incorect';
            return false;
        }

        return true;
    }

    private function doLoginWithEmail($email, $password) {

        if (empty($email)) {
            $this->error = 'email should not be blank';
            return false;
        }

        if (empty($password)) {
            $this->error = 'password should not be blank';
            return false;
        }

        if ( ! Auth::attempt(array('email' => $email, 'password' => $password))) {
            $this->error = 'email or password incorect';
            return false;
        }

        return true;
    }

Nhìn sơ qua có vẻ tốt nhưng nếu để ý chúng ta sẽ thấy code chưa dc kotex, các bạn dễ dàng nhận ra code đã bị WET trong khi kotexcode là phải DRY.

( WET là viết tắt của Write Everything Twice, cũng có thể hiểu là bị ướt, ngược với dry là khô ) :trollface:

Anh em chú ý đoạn này

if (empty($password)) {
   $this->error = 'password should not be blank';
   return false;
}

Đã bị lặp đi lập lại 2 lần trong 2 function.

Tại sao DRY ( cùng 1 thứ chỉ được viết 1 lần ) mới tốt
Câu trả lời rất đơn giản: vì lười.

DRY tốt vì chúng ta là lập trình viên lười biếng, nếu các bạn copy 1 cục code ra 10 chổ khác nhau, vậy thì lúc cần chỉnh sửa mà liên quan đến đoạn code đó, chúng ta phải làm 10 lần.

Kotexcode đoạn code trên lại như sau:


    public function doLogin() {
        $id = $_POST['username'];
        $password = $_POST['password'];

        if (empty($id)) {
            $this->error = 'username or email should not be blank';
            return false;
        }

        if (empty($password)) {
            $this->error = 'password should not be blank';
            return false;
        }

        // mac dinh id se la username.
        $credential = array(
            'username' => $id,
            'password' => $password
        );

        // id co the la email
        if (is_email($id)) {
            $credential = array(
                'email' => $id,
                'password' => $password
            );
        }

        return Auth::attempt($credential);
    }

Code đã trở nên ngắn ngọn dể hiểu, ngay cả sau này BOSS lại nằm mơ đòi user có thể login bằng số điện thoại thì hehe ta chỉ cần thêm 1 câu if nho nhỏ

// id co the la so dien thoai
if (is_phone($id)) {
   $credential = array(
       'phone' => $id,
       'password' => $password
   );
}

vào trước dòng

return Auth::attempt($credential);

là xong. (anh em nên lưu ý là trong thực tế, BOSS rất hay yêu cầu đổi code lung tung, thậm chí sắp deploy còn đòi thêm tính năng là chuyện rất bình thường )

Tóm lại:

Nếu đoạn code nào đó, cần sử dụng lại 1 lần thì copy nó ra cho cho lẹ hehe nhưng chỉ dc copy 1 lần, còn cần dùng ở >=3 chổ khác nhau, thì phải áp dụng kotexcode DRY.

Cách dễ dàng nhất là cho đoạn code trùng lập vào 1 function riêng.

Khi cần chỉ việc sửa ở 1 nơi.

Tuy DRY lúc viết hơi tốn 1 tí tế bào não nhưng sẽ giúp chúng ta có thể lười biếng về lâu dài.

Thà một lần đau mai sau sẽ sướng !

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

quocnguyen

19 bài viết.
983 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
176 58
(Ảnh) Việt nam như các anh em cũng biết là đất nước con rồng cháu tiên với nghề làm web truyền thống chỉ xoay quanh web nhạc, web phim, web tin tứ...
quocnguyen viết 1 năm trước
176 58
White
151 65
(Ảnh) Động lực Đối với nghề lập trình viên thần thánh, nếu một sớm mai thức dậy anh em cảm thấy ko có bất kì động lực nào để tỉnh, chỉ muốn ngủ ...
quocnguyen viết 1 năm trước
151 65
White
103 41
Prototype là hệ thống phân chia quyền lực của giang hồ Sở dĩ ta nói như vậy là vì Khi hỏi object 1 property nào đó, nếu bản thân nó ko làm dc, nó...
quocnguyen viết 2 năm trước
103 41
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
19 bài viết.
983 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!