Kotexcode: code là phải khô thoáng sạch sẽ

Last Updated Sep 05, 2016

Chào các bạn, đã là lập trình viên thì ai cũng biết code.

Khi mới tập tành làm programmer, trình độ newbie thì chúng ta chỉ quan tâm code sao cho chạy là được.

Giỏi hơn tí, trình độ junior thì code không những chạy, mà còn phải chạy nhanh.

Còn senior thì code phải khô thoáng và sạch sẽ, như đang được dùng kotex vậy !

Loạt bài này tôi sẽ giới thiệu nhiều kĩ thuật để chúng ta có thể đạt đến cảnh giới kotex code huyền thoại.

(ở bên mẻo có cuốn sách có tựa đề là clean code tuy chưa hay bằng kotex code của việt nam mình =)) nhưng cũng rất nên đọc, bạn nào đọc dc tiếng anh thì tìm về tham khảo nhé )

1. Kotexcode: return first

Return first là 1 kỹ thuật rất đơn giản

Tuy đơn giản nhưng nhiều người lại không biết đến nó, tôi đã từng gặp nhiều anh/chị có đến mấy năm kinh nguyệt trong người mà vẫn không biết viết return first như thế nào.

Định nghĩa cái đã:

Return first là 1 tuyệt chiêu nhập môn trong bí kiếp kotex code, chiêu này chia làm 2 tư thế, oánh theo trình tự:

  1. Khi gặp vấn đề phải luôn bi quan ! Nghĩ đến trường hợp tồi tệ nhất.
  2. Chia tay sớm, bớt đau khổ.

Chắc không ai hiểu nên thôi lấy cái ví dụ:

Nhiều bạn khi boss giao cho mần 1 cái form login, thì hay viết như thế này:

public function doLogin() {
    if (isset($_POST['username']) && $_POST['username'] !== "") {
        if (isset($_POST['password']) && $_POST['password'] !== "") {
            if (Auth::validate($_POST['username'], $_POST['password'])) {
                // login success
                return true;
            } else {
                $this->error = 'username or password incorect';
                return false;
            }
        } else {
            $this->error = 'password should not be blank';
            return false;
        }
    } else {
        $this->error = 'password should not be blank';
        return false;
    }    
}

Có rất nhiều điểm chưa tốt trong đoạn code trên, if lồng nhau là thấy sợ rồi, phức con mẹ nó tạp, chúng ta có thể viết lại như sau đây để code được khô thoáng hơn

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;
}

Như các bạn thấy, tôi luôn bi quan, nghĩ là username có thể empty, sau đó tôi luôn làm biếng, nếu empty thì return luôn, khỏi chạy chi nữa cho mệt.

Áp dụng return first sẽ giúp code các bạn mỏng hơn, vì không cần dùng if lồng nhau.

Nó cũng có tác dụng làm cho code các bạn dễ đọc hơn.

Tóm lại không cần nhiều lớp mà vẫn thấm hút phi thường. Đạt được hiệu quả y chang sản phẩm cùng loại.

Hi vọng qua bài này, các bạn có thể bỏ return first vào hộp đồ nghề của mình.

Cám ơn các bạn đã đọc. Hẹn gặp lại trong bài kotex code tiếp theo.

2. Kotexcode: DRY

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 !

Hi there. Nodeepshit is a hobby website built to provide free information. There are no chargers to use the website.

If you enjoy our tutorials and examples, please consider supporting us with a cup of beer, we'll use the funds to create additional excellent tutorials.

If you don't want or unable to make a small donation please don't worry - carry on reading and enjoying the website as we explore more tutorials. Have a wonderful day!