Single Responsibility trong SOLID Principle

Bài viết này bàn về S trong SOLID principle.

Trong bài viết này http://longka.info/blog/2015/10/26/a-note-about-solid-principles-demo-in-symfony2/ , mình nói sơ qua về ý nghĩa của từng nguyên tắc trong SOLID và demo với symfony2.

S: Single Responsibility  – tức là một class chỉ nên đảm nhận một nhiệm vụ, hoặc một class nếu có một lý do nào đó để thay đổi thì chỉ có một lý do ( A class should have only one reason to change [1])

Để hiểu rõ hơn, mình sẽ phân tích một ví dụ nó vi phạm qui tắc S sờ này, và làm sao để refactor nó đáp ứng qui tắc S (sờ, không phải rờ mó lung tung nhé).

Giả sử ta có một class Student như sau:

Trong ví dụ về class Student ở trên, bản thân class Student không cần phải quan tâm đến việc kết nối cơ sở dữ liệu thế nào, nó chỉ cần quan tâm đến các thông tin liên quan đến Student, những khóa học mà sinh viên đã đăng ký, hoặc đã học ( bảng enrollment ). Một lý do khác nữa, đó là giả sử sau này khi ta muốn thay đổi thông tin liên quan cơ sở dữ liệu (câu truy vấn, hệ quản trị csdl) ta cũng phải chạy vào class này chỉnh sửa.
Do đó chúng ta cần phải re-factor để khớp với qui tắc Sờ (Lờ) như sau:

Soure code on github https://github.com/nguyentienlong/solid-tut/blob/s-principle/src/Database.php#L8

Lúc đó, bên Class Student, bạn không cần phải quan tâm đến thông tin của db, việc kết nối db thế nào, etc… Hàm getCourses trong class student bây giờ sẽ như  thế này: https://github.com/nguyentienlong/solid-tut/blob/s-principle/src/Student.php#L38

Tuy nhiên bản thân class Student cũng không nên quan tâm lắm đến việc sql truy vấn thế nào, với các hệ quản trị cơ sở dữ liệu khác nhau thì câu query lại khác nhau, khi muốn sửa code chúng ta lại fai vào class Student này để sửa, lý do này không liên quan đế trách nhiệm và bổn phận của class Student. Những thứ liên quan đến db hay move sang class Database.

Do đó, chúng ta refactor lại class Database cho phù hợp với nguyên tắc S sờ như sau

Qua 2 lần refactor, chuẩn Sờ S ?

File database.sql https://github.com/nguyentienlong/solid-tut/blob/master/database.sql – mình dùng postgres sql làm demo.

References:
[1] https://en.wikipedia.org/wiki/Single_responsibility_principle

My vim editor

what I am using with vim now ?

vundle https://github.com/VundleVim/Vundle.vim

Plugins:

~/.vimrc content ( personal preference)

 

Some shortcuts that I used to use:

when I want to run external bash cmd (:! semi and bang)

why vim ?:

fast, convenience with shortcut, search with regular expression …

composer namespace và autoload với psr 4

Mục đích bài viết: Bạn muốn sử dụng namespace va` psr4?

namspace là gì: khi lập trình với JAVA hoặc .NET, chúng ta muốn gom những class liên quan đế nhau vào một package hay namespace.

psr4 là gì http://www.php-fig.org/psr/psr-4/ – là chuẩn để autoload các classes từ đường dẫn chứa classes cần load tự động (autoload)

Vậy autoload là gì? Nhiều người trong chúng ta viết chương trình theo phương pháp hướng đối tượng (OOP) và cứ mỗi class lại viết một file cho nó (theo cách mà JAVA hay .NET tổ chức). Với mục đích như thế, thay vì cứ mỗi file chúng ta lại dùng lệnh include hay require bao gồm cả đường dẫn đến tên file.

Chúng ta muốn đơn giản và tiện lợi hơn như sau

okay, nếu chúng ta đã hiểu thế nào là psr-4, namspace, autoloader – vậy làm sao tôi có thể tự tạo một project áp dụng composer namespace và autoload theo psr4 (hoạc có thể psr0)

Giả sử bạn có cấu trúc thư mức như sau, Student.php là class chứa thông tin về một sinh viên, và chúng ta muốn đặt nó trong namespace là  Longka và trỏ nó đến thư mục src/

composer autoloader psr4 folder structure
composer autoloader psr4 folder structure

và trong file index.php bạn muốn sử dụng cú pháp sau

Để làm điều này, đầu tiên tạo composer.json
Bạn có thể tạo file này bằng cách chạy lệnh

Sau đó trả lời các câu hỏi, nó sẽ cho ra composer.json như sau
Sau đó các bạn add autoload va psr-4 hoặc psr-0
vd:

Sau đó chạy lệnh, composer dumpautoload, nó sẽ generate thư mục vendor nếu có thể require, ở đây chúng ta chỉ bàn về  namespace va autoload .
Composer sẽ generate một số filé để hỗ trợ việc load class theo namespace
Sau đó trong file index.php
bạn chỉ cần

sau đó

Tét thử nhé 😉

php index.php
php index.php

Nếu bạn muốn đào sâu hơn về cách mà composer handle autoload bạn có thể tham khảo các files sau:

 

Mở rộng bài viết một xíu: trong trường hợp trong 1 namespace bạn có rất nhiều Class (es). Ở file index.php bạn không muốn cứ mỗi lần new một object lại use một class, trong khi  đó những class này lại cũng thuộc 1 namespace. Trong JAVA thì bạn có thể sử dụng

Trong php thì sao nhỉ: http://stackoverflow.com/questions/7121682/php-how-to-import-all-classes-from-another-namespace

Tại sao nên dùng PSR-4 với composer nhỉ ? ( pear ?? PSR-0 ??)
http://www.php-fig.org/psr/psr-4/meta/

Demo code:
https://github.com/nguyentienlong/composer-tut1
Tham khảo:
http://www.php-fig.org/psr/psr-4/
https://getcomposer.org/apidoc/master/Composer/Autoload/ClassLoader.html
https://getcomposer.org/doc/01-basic-usage.md#autoloading

php 7 return types and overriding an interface

?? any comments?

Laravel 5 BindingResolutionException in Container.php line 827

Error:

laravel-ioc-binding-exception
laravel-ioc-binding-exception

Context that caused this eror

test controller
test controller
foo service with php primitive type
foo service with php primitive type

When working with laravel 5, have you ever ask yourself that how Laravel IOC work, how Laravel IOC can handle concrete class binding instead of defining in somewhere (for laravel in Service providers).

Basically, if you inject a concrete class to another class, it will automatically bind to that class by laravel Container

Overview of Laravel Container (make, build, getDependencies, resolveClass (or nonClass))

Screenshot from 2016-03-14 09:38:57

 

 

 

 

 

laravel 5 container class:
make function
build function
getDependencies function

By default, If you inject a concrete class to another class, its will automatically bind and resolve by Laravel container.

Service Container Laravel The PHP Framework For Web Artisans
Service Container Laravel The PHP Framework For Web Artisans
laravel ioc build class based on concrete class name
laravel ioc build class based on concrete class name

but, in case in the constructor of some class you inject to a string or non-class parameter, how laravel 5 handle this  https://github.com/laravel/framework/blob/5.2/src/Illuminate/Container/Container.php#L793

laravle-container-getDependencies
laravle-container-getDependencies

Its not acceptable that throw an error if a non-class cannot resolveable, but its not make sense to make a function name resolveNonClass just only throw an error (imo, should handle this 😉

There is many ways to deal with this is that writing an service provider to inject a string to another class like this (basically, a service provider abstract class contains $app instance, just bind a dependency manually into it). This is one way

then register above service provider to config/app.php
 

its works!!!, other way to bypass this, is use Str provider class instead of built in string primitive php type.

foo service with Str class
foo service with Str class

By the way, need to update Laravel Container class to deal with primitive type ??? in this function resolveNonClass https://github.com/laravel/framework/blob/5.2/src/Illuminate/Container/Container.php#L823

laravel fw container resolveNonClass
laravel fw container resolveNonClass

Reference:
https://laravel.com/docs/5.1/container
https://github.com/laravel/framework/blob/5.2/src/Illuminate/Container/Container.php
http://culttt.com/2014/03/24/exploring-laravels-ioc-container/
http://php.net/manual/en/class.reflectionclass.php

 

Gẫm gàn chuyện đời

Mình để title “stay hungry, stay foolish” – hôm nay tự nhiên ngồi gẫm lại cái câu rất đỗi quen thuộc này.

Nhịp đập cuộc sống hối hả, nhiều khi làm cho người ta trở nên lười biếng, bảo thủ, định kiến. Những cuộc tranh luận không dân chủ khiển cho người nhiệt tình, dấn thân rồi cũng lâm vào trạng thái im lặng, makeno (mặc kệ nó). Điều này quả thật nguy hiểm – nếu không tranh luận thẳng thắn, sợ mếch lòng thì con người ta sẽ dễ tự phụ và không sẵn sàng tìm hiểu chân lý để tranh luận, con người dễ dẫn đến sự ù lỳ, lười nhác và ích kỷ.

Phải luôn luôn giữa cho mình một ngọn lửa, đủ âm ỉ để đốt cháy niềm đam mê, và gợi nhớ mỗi khi người ta nản chí – stay hungry, stay foolish

stay hungry
stay hungry
stay foolish
stay foolish

Note về dhcp và file /etc/resolv.conf

Mấy tháng này mò mầm, config trên NetworkManager để chỉnh dns sang 8.8.8.8 mà không được.
Hôm ni rảnh rảnh ngồi vọc trên google thì phát hiện ra nên chỉnh trong file /etc/resolv.conf.
Đại loại là dùng lệnh

Sau đó chỉnh lại nameserver 8.8.8.8
Tuy nhiên, lại thắc mắc một điều là cứ mỗi lần vào một mạng nào đó, file này lại bị edit.
Để tránh trường na`y. Bằng cách nào đó, chúng ta cần phải ngăn chặn dhclient edit file /etc/resolv.conf.
Dùng lệnh

bạn sẽ thấy

HOOKS
When it starts, the client script first defines a shell function, make_resolv_conf , which is later used to create the /etc/resolv.conf file. To override the default behaviour, redefine this function in the enter hook script.

Tức là khi ip cấp bởi dhcp client, nó sẽ gọi dhcp client và edit file /etc/resolv.conf. Để ngăn chặn bạn cần tạo ra một hook để thay đổi hành vi mặc định này (bạn không muốn thằng nào đó đổi dns server chẳng hạn).
Trong fedora, tạo file sau vi /etc/dhclient-enter-hooks với function make_resolv_conf như sau

Sau đó

Sau đó test với các mạng khác nhau xem thử file /etc/resolv.conf có bị thay đổi không nhé 😉

Tham khảo:
http://vacmf.org/2006/12/20/how-to-prevent-dhcp-server-to-override-your-resolvconf-script/comment-page-1/
p/s: cảm ơn Ngô Huy đã hướng dẫn và đưa ra các từ khóa để tìm ra cách giải quyết vấn đề 😉

Góp nhặt những cái nhìn đầu tiên khi đặt chân lên đất Malaysia

Về mặt tổ chức hành chính:
Malaysia chia theo từng bang(theo bác bạn ngồi cạnh chuyến bay – từng làm trợ lý cho vua xứ Mãlay thì có 5 bang lớn, theo chủ hostel thì 14 bang, theo wikipedia thì 15 bang, ??). Trong từng bang lại có một vị vua, và trong các vị vua này sẽ luôn phiên nhau làm vua của vua (vua của Malaysia hiện tại gần 90 tuổi) – vòng xoay là 5 năm (tay chủ hostel thì nói 4 năm). Nhưng quyền lực hiện tại thì nằm trong tay thủ tướng. Về các đảng phái ở Malaysia thì có nhiều đảng và đảng hiện tại đang nắm quyền gần như vô đối (bác bạn đi cùng chuyến bay kể lão nắm quyền hiện tại cụng bá đạo và gần như là “đíc tây tờ”).
Về kinh tế:
Malaysia chỉ sếp sau Singapore (Malay trước đây luôn muốn nuốt trọn và dùng mọi thủ đoạn để níu kéo Sing tự chủ và hình thành một nhà nước độc lập như bây giờ).
Dân số của Malay thì mình không nắm rõ nhưng dân số của KL thì cỡ 1.5 đến 1.6 triệu thua xa nhiều so với Sài Gòn(8.22), Băng Cốc (6.3 triệu), Jakarta là (9.6 triệu) – theo số liệu mình nghe kể và kiểm tra lại qua google.
Tập đoàn có thể nói là “chaebol” của Mã đó là Petronas (cái này là quan điểm riêng của mình). Khi đến KL không thể không nhìn thấy tòa tháp đôi Petronas nổi tiếng, nằm chình ình ngay vị trí đắt xắt ra miếng ở KL.Thời tiết ở Mã lay cũng có hai mùa mưa nắng (chắc tác giả bài hát Quê em hai mùa mưa nắng, một mùa mưa và một mùa không mưa từng qua Malay và nhiều nứoc khác trong ĐNA chăng?).
Về ẩm thực, đồ ăn đồ uống khá đa dạng, phong phú điển hình là ẩm thực Ấn, Tàu, Mã. Giá cả cũng khá hợp lý từ 5-15 ringgit là đủ cho một bữa ăn đầy đủ dinh dưỡng (không lo còi xương nhé).

Về không gian kiến trúc, và cơ sở hạ tầng:
Đường sá rộng rãi, thoáng mát sạch sẽ. Cây xanh 2 bên đường nhiều và toàn là những cây cổ thụ, nếu ở Việt Nam chắc là bị “sâu” ăn từ ngọn đến rễ từ lâu rồi :|. Bố trí kiến trúc khá hài hòa giữa các cụm nhà cao tầng kết hợp công viên, cây xanh, hồ nước. Khoảng cách giữa các cụm nhà cao tầng khá hợp lý – đủ để người ta vươn tầm nhìn ra xa, không cảm giác ngột ngạt bởi những tòa nhà chọc trời. Họ cũng có một con kênh vừa (không lớn lắm) nằm len lỏi ngay KL.
Ở Malay có 3 nhóm người chính: Mã-Mã, Mã-Ấn và Mã Trung. Người Mã-Mã có vẻ cởi mở và thân thiện nhất (theo suy nghĩ chủ quan của tui là như vậy).
Tiếng Anh của người Mã khá tốt – giọng chuẩn Anh (tất nhiên là không chuẩn = giọng Mỹ của tôi :v ). Đến đoạn ni quảng cáo 5s – tôi hay chém gió với mấy ku Tây balo và mấy ku bạn cùng công ty bên Ben Cốt(BK). Tụi nó cứ nghĩ tui du học đâu đó từ Mỹ, hay Úc hay Anh (tất nhiên ko phải từ sao hỏa). Tui khiêm tốn phán “tiếng Anh của tao chỉ là mức trung bình ở Việt Nam” – đứa nào cũng mồm miệng tròn vo như chữ o (tròn gần = quả trứng gà). Ở trên mạng (youtube) có rất nhiều nguồn để các bạn có thể luyện giọng Mỹ (giọng mỹ hay, đơn giản các bạn nên luyện 😉 ).
Kết thúc phần một, đấy là những mảnh vụn góp nhặt được trong hôm nay, ngày đầu tiên tại KL. Đây là những dòng viết sau khi trải nghiệm lòng vòng KL, góc nhìn còn hạn hẹp (do thời gian ngắn), chỉ là quan điểm cá nhân, có thể mỗi người sẽ có một cảm nhận khác khi đến Malaysia, nhưng mình nghĩ, ASEC bắt đầu có hiệu lực, chúng ta hiểu sâu hơn về văn hóa, con ngừoi, lịch sử, thể chế của các nước thành viên, chúng ta sẽ biết các tiếp cận khéo léo và dễ dàng hơn là thầy bói xem voi (đừng hoang tưởng về ASEC 😉 . Một điều nữa là khi đọc sách, hay đọc note này chỉ giúp bạn có những ý niệm về một thứ gì đó chưa rõ ràng đối với bạn, nó sẽ hữu ích hơn khi bạn thực tế trải nghiệm, chiêm nghiệm về những cái mà bạn đã đọc 😉