Xây d ng b y thói quen t t v h      ng    it    ng trong PHP                                 Page 1 of 14




 Xây d ng b y thói quen t t v h                                  ng        it       ng
 trong PHP
 M c    : Trung bình

 Nathan A. Good, K s tr     ng, t v n, Freelance Developer

 13 06 2009

        V i các c tính c a ngôn ng h ng i t ng (OO) c a PHP, n u b n còn ch a t o ra các
         ng d ng c a b n v i các nguyên t c OO (object-oriented) trong tâm trí, thì b y thói quen
        này s giúp b n b t u quá trình chuy n ti p gi a l p trình th t c và l p trình h ng i
        t ng.

 Trong nh ng ngày u c a l p trình PHP, mã PHP ã b gi i h n là ngôn ng theo th t c v b n ch t. Mã
 theo th t c (Procedural code) mô t cách s d ng các th t c cho các kh i xây d ng c a ng d ng. Các
 th t c cung c p m t m c tái s d ng nh t nh khi cho phép các th t c      c g i b i các th t c khác.

 Tuy nhiên, dù không có các k t c u c a ngôn ng h ng i t ng, m t l p trình viên v n có th     a thêm
 các c tr ng OO vào trong mã PHP. S có m t chút khó kh n h n và có th làm cho mã khó c h n b i
 vì nó pha tr n các m u (ngôn ng theo th t c v i thi t k OO gi ). Các k t c u OO trong mã PHP — nh
 là kh n ng nh ngh a và s d ng các l p, kh n ng xây d ng các m i quan h gi a các l p có s d ng
 quy n th!a k và kh n ng nh ngh a các giao di n — s làm cho vi c xây d ng mã tuân th các thói
 quen th c hành OO t t d" dàng h n nhi u.

 Trong khi các thi t k theo th t c thu n túy không có nhi u tính mô un v n ch y t t, các l i th c a thi t
 k OO s xu t hi n trong khâu b o trì. B i vì m t ng d ng i n hình s dành r t nhi u th#i gian s ng c a
 nó cho vi c b o trì, b o trì mã có chi phí r t cao trong su t cu c #i c a m t ng d ng. Nó c$ng có th d"
 dàng b b% quên trong lúc phát tri n. N u b n ang trong m t cu c ua làm cho ng d ng c a b n             c
 phát tri n và tri n khai, tính d" b o trì v dài h n có th t m lùi xu ng gh sau, hãy cho m t cái gì ó
 b t u ho t ng ã.

 Tính mô un (Modularity) — m t trong nh ng c tr ng then ch t c a thi t k OO t t — giúp cho vi c
 b o trì này. Tính mô un giúp bao gói các thay &i, s làm cho m r ng và s a &i ng d ng theo th#i gian
 d" dàng h n.

 Trong khi có nhi u h n b y thói quen xây d ng ph n m m OO v t&ng th , b y thói quen sau ây là
 nh ng gì b n c n làm cho mã c a b n phù h p v i các tiêu chu'n thi t k OO c b n. Chúng cho b n
 m t n n t ng v ng ch c nh# ó b n có th b& sung thêm các thói quen OO và xây d ng ph n m m d"
 dàng     c b o trì và   c m r ng. Các thói quen nh m t i m t s trong các c tr ng then ch t c a tính
 mô un. ( bi t thêm thông tin v l i ích c a thi t k OO, c l p v i ngôn ng , xem Tài nguyên.

 B y thói quen t t v OO trong PHP là:
   1.   Hãy khiêm t n.
   2.   Hãy là m t láng gi ng t t.
   3.   Tránh nhìn vào Medusa.
   4.   Gi v ng nguyên t c liên k t y u nh t.
   5.   B n là cao su, tôi là keo dán.
   6.   Duy trì m t gia ình.
   7.   Ngh n các m u.

 Hãy khiêm t n
 Hãy khiêm t n là tránh t tr ng mình ra trong tri n khai th c hi n các l p và các hàm c a b n. Vi c che
 gi u thông tin là m t thói quen c b n. B n s có m t th#i gian khó kh n xây d ng b t k) các thói quen
 nào khác, cho n khi b n ã t p       c thói quen che gi u các chi ti t tri n khai th c hi n c a b n. Che
Xây d ng b y thói quen t t v h       ng    it    ng trong PHP                                  Page 2 of 14



 gi u thông tin c$ng     c g i là s bao gói (encapsulation).

 Có r t nhi u lý do t i sao tr c ti p l ra các tr #ng công c ng là m t thói quen x u. (i u quan tr ng
 nh t trong s ó là nó không l i cho b n m t tùy ch n nào n u m t cái gì ó trong tri n khai th c hi n
 c a b n thay &i. B n s d ng các khái ni m OO cô l p s thay &i và vi c bao gói óng m t vai trò
 không th thi u       c trong vi c b o m r*ng b t k) s thay &i nào mà b n th c hi n không ph i là m t
 ki u virút trong t nhiên. Nh ng thay &i ki u Virút là nh ng thay &i b t u là nh% — gi ng nh vi c
 thay &i m t m ng ch a ba ph n t thành ch+ ch a có hai. ( t nhiên, b n nh n th y r*ng b n ang thay
  &i càng ngày càng nhi u mã c a b n thích nghi v i m t thay &i l ra là không áng k .

 M t cách n gi n b t u che gi u thông tin c a b n là gi các tr #ng riêng t (private) và ch+ l
 chúng thông qua các hàm truy c p công c ng, gi ng nh các c a s& trong nhà b n. Thay vì có toàn b c
 m t b c t #ng m toang ra bên ngoài, thì b n ch+ có m t ho c hai c a s&. (Tôi nói thêm v hàm truy c p
 công c ng trong "Thói quen t t: S d ng hàm truy c p công c ng").

 Ngoài vi c cho phép các tri n khai th c hi n c a b n di"n ra sau b c màn i v i các thay &i, vi c s
 d ng nh ng hàm truy c p công c ng thay vì tr c ti p l các tr #ng cho phép b n xây d ng thêm d a
 trên tri n khai th c hi n n n t ng c a b n b*ng cách è lên (overriding) tri n khai th c hi n c a m t hàm
 truy c p làm m t cái gì ó h i khác v i hành vi ng x c a cha m,. Nó c$ng cho phép b n xây d ng
 m t tri n khai th c hi n tr!u t ng (abstract) trì hoãn vi c tri n khai th c hi n th c t các l p è lên
 n n t ng ã có.

 Thói quen x u:         l các tr     ng công c ng
 Trong ví d mã x u trong Li t kê 1, các tr #ng c a các i t ng Person         c l ra tr c ti p nh là các
 tr #ng công c ng thay vì qua các hàm truy c p. Trong khi hành vi này r t cám d-, c bi t là cho các i
 t ng d li u ít quan tr ng, thì nó l i h n ch b n.

 Li t kê 1. Thói quen x u v vi c      l các tr    ng công c ng




         !"            #$ %#
         !"               #&   #

                  !"
                  !"

   "


 N u có b t k) i u gì thay &i v i m t i t ng, b t k) mã nào s d ng nó c$ng c n ph i thay &i theo.
 Ví d , n u h , tên, tên m c a m t ng #i ã      c bao b c trong m t i t ng PersonName, b n s c n
 ph i s a &i t t c các mã c a b n cho phù h p v i s thay &i ó.

 Thói quen t t: S      d ng các hàm truy c p công c ng
 B*ng cách s d ng các thói quen OO t t (xem Li t kê 2), cùng m t i t ng bây gi# có các tr #ng riêng
 t thay cho các tr #ng công c ng và các tr #ng riêng t         c tr ng ra m t cách th n tr ng v i th gi i
 bên ngoài b*ng các ph ng th c get và set công c ng,           c g i là nh ng hàm truy c p (accessors).
 Nh ng hàm truy c p bây gi# cung c p m t cách công c ng nh n thông tin t! l p PHP c a b n sao cho
 n u có thay &i gì trong các tri n khai th c hi n c a b n, thì ít có kh n ng là b n c n ph i thay &i t t c
 các mã ã s d ng l p y.

 Li t kê 2. Thói quen t t s d ng nh ng hàm truy c p công c ng


              '
Xây d ng b y thói quen t t v h                    ng    it   ng trong PHP                            Page 3 of 14



              '
              '
              '

                            '       '

              '        !"


                            '       '

              '             '     !"


                            '       '(

              '        !"


                            '       '(

              '             '     !"


                            '       ')
              '        !"


                            '       ')

              '             '     !"


                            '       '*
              '        !"

                            '       '*

              '




         !"       '              #$ %#
         !"       '(                #&        #
                   !"       '
                   !"       '(
   "


 Tho t nhìn i u này có v. s thêm nhi u công vi c h n và có th th c s là nhi u vi c h n m t tr c.
 Tuy nhiên, th #ng vi c áp d ng thói quen OO t t s    c n bù l i trong lâu dài v sau, b i vì các thay
  &i trong t ng lai    c c ng c ch c ch n.

 Trong phiên b n mã      c hi n th trong Li t kê 3, tôi ã thay &i vi c tri n khai th c hi n bên trong s
 d ng m t m ng k t h p cho các ph n c a tên. Lý t ng ra, ph i có nhi u x lý l-i h n và ki m tra c'n
 th n h n xem ph n t ó có t/n t i không, nh ng m c ích c a ví d này là cho th y làm th nào các
 mã s d ng l p c a tôi không c n ph i thay &i — th t h nh phúc là nó không bi t          c v s thay &i l p
 c a tôi. Hãy nh r*ng lý do ch p nh n các thói quen OO là bao gói c'n th n các thay &i cho mã c a
 b n có kh n ng m r ng h n và d" b o trì h n.

 Li t kê 3. M t s a              i khác theo thói quen t t này v i vi c tri n khai th c hi n bên trong khác i


              '

                            '       '

              '        !"                +,        ,-


                            '       '
Xây d ng b y thói quen t t v h                          ng   it      ng trong PHP                               Page 4 of 14



                 '             '     !"                 +,          ,-


                               '         '(
                 '        !"                  +,             ,-


                               '         '(
                 '             '     !"                 +,                ,-


       ./   ' %%% /.


  ./
   / 0      '                  '      '                      ' '               12 '    1        '           '
   / '               % 3                                                 ' 1     ' '                %
   /.

            !"       '              #$ %#
            !"       '(                #&          #

                      !"       '
                      !"       '(

   "




 Hãy là m t láng gi ng t t
 Khi b n xây d ng m t l p, nó c n x lý l-i riêng c a mình m t cách thích h p. N u l p không bi t làm
 th nào x lý các l-i, nó c n gói chúng theo m t nh d ng mà ng #i g i nó hi u           c. Ngoài ra, tránh
 tr v các i t ng không t/n t i (null) hay trong tr ng thái không h p l . Nhi u tr #ng h p, b n có th
 làm i u này n gi n b*ng cách ki m tra các i s và a ra các ngo i l c th             nói lý do t i sao các
    is     c cung c p không h p l . Khi b n xây d ng thói quen này, nó có th ti t ki m cho b n — và
 nh ng ng #i ang b o trì mã c a b n ho c ang s d ng các i t ng c a b n — r t nhi u th#i gian.

 Thói quen x u: Không x                         lý các l i
 Xem xét ví d hi n th trong Li t kê 4, trong ó ch p nh n m t s       i s và tr v m t i t ng Person
 v i m t s các giá tr ã      c i n vào. Tuy nhiên, trong ph ng th c parsePersonName() không có
 xác nh n h p l     xem li u bi n $val     c cung c p là b*ng null, là m t chu-i ký t có chi u dài b*ng
 không hay là m t chu-i ký t mà khuôn d ng sai, không phân gi i         c. Ph ng th c parsePersonName
 () không tr v m t i t ng Person mà tr v null. Các qu n tr viên ho c các l p trình viên s d ng
 ph ng th c này có th ph i vò u b t tai và — ít nh t c$ng là — i n ch- ph i b t u thi t l p các
  i m ng t và g0 r i k ch b n l nh PHP.

 Li t kê 4. Thói quen x u không                         a ra hay không x lý các l i
                      4'

                      ' '                '                                     '2
                      '             #2#2               " 5
                               '               ' #2#2              .. 6        '           '2           '
                                    !"       '(                   ' +7-
                                    !"       ')                    ' +5-
                 '




 Ph ng th c parsePersonName() trong Li t kê 4 có th         c s a &i kh i t o i t ng Person bên
 ngoài i u ki n if, khi m b o r*ng b n luôn luôn nh n m t i t ng Person h p l . Tuy nhiên, b n s
 nh n    c m t Person mà các thu c tính còn ch a    c thi t l p, i u này c$ng không a b n n m t
Xây d ng b y thói quen t t v h                       ng       it       ng trong PHP                                          Page 5 of 14



 v trí t t h n.

 Thói quen t t: M i mô un x                          lý các l i riêng c a nó
 Thay vì m c cho ng #i g i l p c a b n ph%ng oán, hãy ch         ng ki m tra tính h p l c a các i s .
 N u m t bi n ch a thi t l p không th t o ra m t k t qu h p l , hãy ki m tra bi n và a ra m t
 InvalidArgumentException. N u chu-i ký t không th tr ng r-ng ho c ph i có m t nh d ng c th ,
 hãy ki m tra nh d ng và a ra m t ngo i l . Li t kê 5 bi u th làm th nào t o ra các ngo i l c a
 riêng b n, c$ng nh m t s i u ki n m i trong ph ng th c parsePerson() gi i thích m t s các
 xác nh n h p l ban u.

 Li t kê 5. Thói quen t t                   a thêm các báo l i
         8        1                     )       '0        '            '       1    9             0        '


                  4'
                  ' '               '                                                    '2

                  :             '
                  '                 8           1                  )           '0        '            #8       1           '%#


                   :        '                   ;;   '                              5
                  '                 8           16            '0           '        #$        '                    !   '         %#




   "


 Dòng d i áy là cái mà b n mu n m i ng #i có th s d ng l p c a b n mà không ph i bi t các ho t
   ng bên trong c a nó. N u h s d ng nó không úng ho c theo cách mà b n ã không d          nh, h
 không ph i ph%ng oán lý do t i sao nó không ho t ng. V i t cách là m t láng gi ng t t, b n hi u r*ng
 m i ng #i s d ng l i l p c a b n mà không ph i là các th y bói và do ó b n nên lo i b% vi c ph%ng
  oán ó.




 Tránh nhìn vào Medusa
 Khi tôi l n u tiên h c v các khái ni m OO, tôi ã nghi ng# r*ng các giao di n là th c s có ích hay
 không. M t /ng nghi p c a tôi ã nêu ra phép so sánh vi c không s d ng các giao di n gi ng nh ang
 nhìn vào cái u c a Medusa. Trong th n tho i Hy L p, Medusa là m t qu1 cái có b tóc là nh ng con r n.
 B t k) ng #i nào mà nhìn th2ng vào nó s bi n thành á. Perseus, ng #i ã gi t Medusa, ã có th      i phó
 v i con qu1 b*ng cách nhìn vào hình nh ph n chi u c a nó trong cái khiên c a anh, vì v y không b bi n
 thành á.
 Giao di n là t m g ng c a b n        i phó v i Medusa. Khi b n s d ng m t tri n khai th c hi n c th ,
 rõ ràng, mã c a b n ph i thay &i n u mã tri n khai th c hi n c a b n thay &i. Vi c s d ng tr c ti p các
 tri n khai th c hi n s h n ch các tùy ch n c a b n, gi ng nh b n ã bi n các l p c a b n thành á.

 Thói quen x u: Không s                       d ng các giao di n
 Li t kê 6 hi n th m t ví d n p i t ng Person t! m t c s d li u. Nó nh n tên person và tr v
   i t ng Person phù h p l y t! c s d li u.

 Li t kê 6. Thói quen x u không s d ng các giao di n

         <=                 1

                        '           '                              2
Xây d ng b y thói quen t t v h                                          ng        it          ng trong PHP            Page 6 of 14




                ./        '       '           1 '               2           ' '                     %%% /.

                              !"      '                    #$ %#
                              !"      '(                      #&              #
                 '



  ./ 8          1 '           '                     1 ' %%% /.
           1                   <=                        1
                               1 !"               '        #&                     #2 #<        #

                      !"      '
                      !"      '(

   "


 Mã n p Person t! c s d li u là t t cho n khi có m t s i u gì ó thay &i trong môi tr #ng. Ví
 d , n p Person t! c s d li u có th là t t cho phiên b n u tiên c a ng d ng, nh ng i v i phiên
 b n th hai, b n có th c n ph i thêm các kh n ng n p person t! m t d ch v web. V b n ch t, l p ã
 bi n thành á vì nó ang tr c ti p s d ng l p tri n khai th c hi n và bây gi# r t d" h%ng n u thay &i.

 Thói quen t t: S                     d ng các giao di n
 Li t kê 7 cho th y m t ví d v mã mà s không thay &i khi m t cách n p m i tr thành s3n có cho ng #i
 s d ng và       c tri n khai th c hi n. Ví d cho th y m t giao di n   c g i là PersonProvider, có khai
 báo ch+ m t ph ng th c. N u mã b t k) s d ng PersonProvider, thì mã ó s b ng n c n không
     c s d ng tr c ti p các l p tri n khai th c hi n. Thay vào ó, nó s d ng PersonProvider gi ng nh
  ó là m t i t ng th c s .

 Li t kê 7. Thói quen t t v s d ng các giao di n
       '                                      1

                              '               '                                           2


           <=                         1                             '                               1
                              '               '                                           2

                ./        '       1 '                  '    '           1 '               2        ' '       %%% /.

                              !"      '                    #$ %#
                              !"      '(                      #&              #
                 '



                                  1       )       '
                      ' '                     '                     '                 1        '

                      '                       ,1 '                  ,

                          '                       <=                              1

                          '                                             1




                  ,1 '                ,
  ./ 8          1 '    '                              1 ' %%% /.
           1                                      1     ) '     >>    '                                 1
                              1       !"          '          #&    #2 #<                       #
                      !"      '
                      !"      '(
   "


 Khi b n s d ng các giao di n, c g ng tránh tham chi u tr c ti p n các l p tri n khai th c hi n. Thay
 vào ó, hãy s d ng m t cái gì ó bên ngoài i t ng c a b n cung c p cho b n vi c tri n khai th c
 hi n úng. N u l p c a b n n p vi c tri n khai th c hi n d a trên m t s logic, nó v n c n yêu c u các
Xây d ng b y thói quen t t v h                                       ng           it        ng trong PHP                                                Page 7 of 14



   nh ngh a c a t t c các l p tri n khai th c hi n và i u này s không                                                              a b n ti n thêm bao nhiêu.

 B n có th s d ng m t m u nhà máy (Factory) t o ra m t cá th c a m t l p tri n khai th c hi n giao
 di n c a b n. M t ph ng th c factory, theo quy c, b t u b*ng vi c t o và tr v m t giao di n.
 Nó có th nh n b t k) i s nào c n thi t cho ph ng th c factory c a b n tìm ra l p tri n khai th c
 hi n nào là m t l p úng tr v .

 Trong Li t kê 7, ph ng th c createProvider() n gi n ch+ dùng m t bi n $type. N u $type          c
 thi t l p là c s d li u, ph ng th c database, s tr v m t cá th c a DBPersonProvider. B t k)
 vi c tri n khai th c hi n m i n p nhi u Person t! m t kho l u tr không c n b t k) s thay &i nào
 trong l p có s d ng ph ng th c Factory và giao di n. DBPersonProvider th c hi n giao di n
 PersonProvider và có tri n khai th c hi n th c t ph ng th c getPerson() bên trong nó.




 Gi      v ng nguyên t c liên k t y u nh t
 L p ghép l ng các mô un c a b n là m t vi c t t; nó là m t trong các tính ch t cho phép b n óng gói
 s thay &i. Hai trong s các thói quen khác — "Hãy khiêm t n" và "Tránh nhìn vào Medusa" — giúp b n
 làm vi c theo h ng xây d ng các mô un        c l p ghép l%ng. ( l p ghép l%ng các l p c a b n, hãy phát
 tri n c tính cu i cùng b*ng cách xây d ng thói quen v vi c làm gi m s ph thu c gi a các l p c a
 b n.

 Thói quen x u: L p ghép ch t
 Trong Li t kê 8, vi c làm gi m s ph thu c không nh t thi t là làm gi m các s ph thu c i v i trình
 khách s d ng m t i t ng. Thay vào ó, ví d minh ho vi c làm gi m các s ph thu c vào m t l p
 chính xác và t i thi u s ph thu c này i v i các l p khác.

 Li t kê 8. Thói quen x u v l p ghép ch t t                                                         it     ng Address

    ?    @        #%.611                     )           ''              %        #

        611

              '       11             9           7
              '       11             9           A
              '        '
              '       ' '        ..                                       %%%
              '         '       B 1
              '             '
                       '                 '611                    9        7                 7
              '   !" 11                  9           7                        7


                                 ./                                  2       ' %%% /.
                       '                 'B              '

              '        '             !"              '


                       '                         '       '

                  '                      #               #
                                ''                           8                611               )        ''
                                     '                   #           '                #
                                ''                           $       '                611            )        ''
                                ''                                       611           )             ''

              '                          '' !"     ' '                                 !"           '611          9    7   2
                  '         !"           '611    9  A 2
                  '         !"           'B '   2 '   !"                               '*' '             2    '       !"   '   '    B 1    2
                  '         !"           'B   '
Xây d ng b y thói quen t t v h                                         ng       it           ng trong PHP                                             Page 8 of 14



       11           611
       11   !"   '611    9    7 #7AC 6  *'%#
       11   !"   '611    9    A #*' A55#
       11   !"   'B ' #6 '      #
       11   !"   '*' ' #6D#
       11   !"   '    ' B 1 #EEEEE!5555#
       11   !"   'B    '   #4*#

              11 !"             ' #             '                 #
            #F #

              11 !"             ' #                      #
            #F #
   "


 (o n mã g i ph ng th c format() c a m t i t ng Address có th trông r t n t ng — t t c m i
 vi c mà nó làm là s d ng l p Address, g i ph ng th c format(), và th là xong. Ng c l i, l p
 Address không may m n nh v y. Nó c n ph i bi t nhi u trình nh d ng (formatters) khác nhau     cs
 d ng      nh d ng úng. (i u này có th làm cho i t ng Address không có kh n ng s d ng l i v i
 nh ng ng #i khác, c bi t là n u m t ng #i nào khác không quan tâm n vi c s d ng các l p c a trình
   nh d ng trong ph ng th c format(). M c dù mã ang s d ng Address hi n không có nhi u s ph
 thu c, nh ng l p Address l i có m t s ph thu c, trong khi nó l ra ch+ là m t i t ng d li u n
 gi n.
 L p Address   c l p ghép ch t v i các l p tri n khai th c hi n                                                                bi t cách làm th nào   nh d ng
 m t i t ng Address.

 Thói quen t t: L p ghép l ng gi a các                                                         it         ng
 Khi xây d ng các thi t k OO t t, c n suy ngh v m t khái ni m g i là Phân tách các m i quan tâm
 (Separation of Concerns-SoC). SoC có ngh a là b n c g ng phân tách các i t ng theo cái mà chúng
 th c s dính líu n, do ó, làm l%ng vi c l p ghép. Trong l p Address ban u, nó ã ph i quan tâm n
 vi c làm th nào      nh d ng chính nó. (i u ó có l không ph i là m t thi t k t t. Thay vào ó, m t l p
 Address c n lo l ng v các ph n c a Address, trong khi m t s ki u trình nh d ng lo l ng v vi c làm
 th nào       nh d ng úng các a ch+.

 Trong Li t kê 9, mã nh d ng a ch+     c di chuy n n các giao di n, các l p tri n khai th c hi n và
 m t nhà máy (factory) — hãy nh xây d ng thói quen "s d ng các giao di n". Bây gi#, l p
 AddressFormatUtils có trách nhi m t o ra m t trình nh d ng và nh d ng m t Address. B t k) i
 t ng khác nào bây gi# có th s d ng m t Address mà không c n ph i lo l ng v vi c ph i có        c nh
 ngh a v các trình nh d ng.

 Li t kê 9. Thói quen t t v l p ghép l ng gi a các                                                        it        ng


       '         611            )           ''
                             '                      '             11        9           72      11             9         A2    ' 2     ' ' 2
                       '     B 1 2                       '


             $   ' 9         611            )                ''                         '      611             )          ''
                             '                      '             11        9           72      11             9         A2    ' 2     ' ' 2
                       '     B 1 2                       '

                 '                      '       #G F G F G 2 G                          G F G #2
                           11           9        72   11    9                           A2    ' 2                  ' ' 2        '    B 1 2     '



             8         611          )               ''                          '       611          )              ''

                             '                      '             11        9           72      11             9         A2    ' 2    ' ' 2
                       '     B 1 2                       '
                 '                      '       #G G 2 G 2 G                        G        G #2
                           11           9        72  11    9                            A2          ' 2            ' ' 2        '    B 1 2     '
Xây d ng b y thói quen t t v h                                      ng        it        ng trong PHP                                              Page 9 of 14




             611        )          '4'

                        ' '                 '                       '611                    '           2    11
                            ''              611         )               '4'        >>               ' 611              )        ''        '

                   '                     ''            !"     '  11   !" '611                                          9        7    2
                            11          !"           '611     9  A 2
                            11          !"           'B '    2  11   !" '*' '                                      2
                            11          !"           '    ' B 1    2
                            11          !"           'B    '


                   '    ' '                      '                  ' 611               )               ''         '

                        '                   #           #
                                   ''                       8            611                )           ''
                                        '               #           '          #
                                   ''                       $       '          611                  )        ''

                                   ''                                   611        )                ''

                   '                        ''



       11             611
       11   !"     '611    9    7 #7AC 6  *'%#
       11   !"     '611    9    A #*' A55#
       11   !"     'B ' #6 '      #
       11   !"     '*' ' #6D#
       11   !"     '    ' B 1 #EEEEE!5555#
       11   !"     'B    '   #4*#

            611         )         '4'            >>             '611               #            '            #2        11
            #F #
            611         )         '4'            >>             '611               #                    #2        11
            #F #
   "


 M t h n ch , t t nhiên, là b t c khi nào s d ng các m u hình s3n, th #ng c$ng có ngh a là s l ng các
 t o ph'm (các l p, các t p tin) t ng lên. Tuy nhiên, i u này    c bù p b*ng vi c gi m công s c b o trì
 trong m-i l p và có th       c gi m nhi u h n n a n u có     c kh n ng s d ng l i úng cách.




 B n là cao su; tôi là keo dán
 Các thi t k OO k t dính cao là r t t p trung và    c t& ch c thành các mô un liên quan. Tìm hi u k
 "các m i quan tâm" là r t quan tr ng trong vi c xác nh t& ch c các hàm và các l p nh th nào k t
 dính ch t ch .

 Thói quen x u: K t dính th p
 Khi m t thi t k có k t dính th p, nó có các l p và các ph ng th c không     c nhóm l i thích h p. Thu t
 ng mã spaghetti th #ng        c s d ng mô t các l p và các ph ng th c         c gói chung v i nhau và
 có k t dính th p. Li t kê 10 cung c p m t ví d v mã Spaghetti. L p t&ng quát Utils s d ng nhi u i
 t ng khác nhau và có r t nhi u s ph thu c. Nó làm m-i th m t tí, làm cho khó có th s d ng l i.

 Li t kê 10. Thói quen x u v k t dính th p


             4'

                        ' '                 '                       '611                                '3         2       11        72
                   11         A2            ' 2         ' '
                   '          #             11                  '         #


                        ' '                 '                       '                                        '3            2                  2
Xây d ng b y thói quen t t v h                     ng        it       ng trong PHP                                 Page 10 of 14




              '          #                         #


                   ' '            '                611                    '3         2

          ..                           ' '               1        '        2    ' %%%
            '                 611


                   ' '            '                3                                         '3       2

          ..                           ' '               1        '        2    ' %%%
            '                 3



   "


 Thói quen t t: Gi            v ng nguyên t c k t dính cao
 K t dính cao có ngh a là các l p và các ph ng th c có liên quan v i nhau        c nhóm l i. Khi các ph ng
 th c và các l p có k t dính cao, b n có th d" dàng tách ra toàn b nhóm mà không nh h ng n thi t
 k . Các thi t k có k t dính cao t o ra c h i cho l p ghép l%ng. Li t kê 11 hi n th hai trong s các
 ph ng th c       c t& ch c t t h n thành l p. L p AddressUtils có ch a các ph ng th c làm vi c
 v i các l p Address và cho th y s k t dính cao gi a các ph ng th c có liên quan n a ch+. T ng t ,
 PersonUtils ch a các ph ng th c           làm vi c riêng v i các i t ng Person. Hai l p m i này v i
 các ph ng th c k t dính cao c a chúng s l p ghép l%ng vì chúng có th          c s d ng hoàn toàn c l p
 v i nhau.

 Li t kê 11. Thói quen t t v k t dính cao

        611        4'

                   ' '            '                '611                    '3            2       11       72
              11         A2       ' 2        ' '

              '          #        11           '         #


                   ' '            '                611                    '3         2
          ..                           ' '               1        '        2    ' %%%
            '                 611




                   4'

                   ' '            '                '                            '3               2             2


              '          #                         #


                   ' '            '                                             '3           2
          ..                           ' '               1        '        2    ' %%%
            '



   "




 Duy trì m t gia ình
 Tôi th #ng nói v i m i ng #i trong các nhóm ph n m m, mà tôi làm lãnh k thu t o hay ki n trúc s
 r*ng k. thù l n nh t c a các ngôn ng OO là hành ng sao chép và dán. Khi ch a có thi t k OO chu'n
Xây d ng b y thói quen t t v h                    ng   it   ng trong PHP                  Page 11 of 14



 b tr c, không có gì . ra nhi u l n x n h n là vi c sao chép mã t! m t t p tin này vào t p khác. B t c
 khi nào mà b n nh sao chép mã t! m t l p này t i m t l p ti p theo, hãy d!ng l i và xem xét làm sao có
 th s d ng các h th ng th b c c a l p s d ng các ch c n ng t ng t hay gi ng nhau. B n s th y
 r*ng trong nhi u tr #ng h p, v i thi t k t t, vi c sao chép mã là hoàn toàn không c n thi t.

 Thói quen x u: Không s                       d ng h th ng th     b c các l p
 Li t kê 12 cho th y m t ví d     n gi n c a các l p b ph n. Chúng b t u v i các tr #ng và các ph ng
 th c gi ng h t — v lâu dài s không t t khi ng d ng có th ph i thay &i. N u có m t khi m khuy t
 trong l p Person có nhi u kh n ng c$ng s là m t khi m khuy t trong l p Employee vì nó xu t hi n
 qua tri n khai th c hi n b*ng cách sao chép gi a hai l p.

 Li t kê 12. Thói quen x u không s d ng các h th ng th b c


               '
               '


           0
               '
               '


   "


 Quy n th a k là m t thói quen khó b t u áp d ng vì thông th #ng, vi c phân tích xây d ng các mô
 hình quy n th!a k úng n có th m t nhi u th#i gian. Ng c l i, s d ng Ctrl+C và Ctrl+V xây
 d ng m t tri n khai th c hi n m i ch+ m t vài giây. Tuy nhiên, kho ng th#i gian này th #ng r t nhanh
     c bù p l i trong b o trì, n i ng d ng s th c t tr i qua h u h t ph n #i c a nó.

 Thói quen t t: S               d ng quy n th a k
 Trong Li t kê 13, l p Employee m i m r ng l p Person Bây gi# nó k th!a t t c các ph ng th c
 chung và không tri n khai th c hi n l i chúng. Ngoài ra, Li t kê 13 cho th y vi c s d ng m t ph ng
 th c tr!u t ng gi i thích r*ng ch c n ng c b n có th           c a vào m t l p c s và ch c n ng c
 th h n có th     lui l i cho n khi tri n khai th c hi n m t l p.

 Li t kê 13. Thói quen t t v s d ng quy n th a k

       '   '

               '
               '

                        '         '(
               '   !"


                        '         '(

               '        '        !"

                        '         ')

               '   !"

                        '         ')

               '        '        !"


                        '             H
                   #H           2 8           #
               '   !"       '    1        *
Xây d ng b y thói quen t t v h                         ng       it       ng trong PHP                         Page 12 of 14




         '       '                            '        '    1    *



        0                        '   1

             '
                             '           'I

             '       !"


                             '           'I

             '               '       !"


                             '           '    1   *

                         '        !" 'I               % # # %        '        !"   '(   % # # %
                     '           !" ')


   "




 Ngh                 n các m u
 Các m u thi t k là các t ng tác ph& bi n gi a các i t ng và các ph ng th c mà ã           c th#i gian
 ki m ch ng là gi i quy t t t nh ng bài toán c th . Khi b n ngh v các m u hình thi t k , t c là b n ang
 b t bu c mình l nh h i vi c các l p t ng tác v i nhau nh th nào. (ó là m t cách d" dàng xây d ng
 các l p và các t ng tác c a chúng mà không m c ph i các l-i gi ng nh nh ng ng #i khác ã m c ph i
 trong quá kh và h ng l i t! các thi t k ã        c ki m ch ng

 Thói quen x u: Xem xét m i l n m t                                      it        ng
 Th c s là không có ví d mã thích h p nào gi i thích          c ngh n các m u hình là nh th nào (m c
 dù có nhi u ví d t t cho th y các tri n khai th c hi n theo m u hình). Tuy nhiên, nói chung, b n s bi t
 b n ang xem xét riêng l. t!ng i t ng m-i l n khi các d u hi u sau ây là úng:
       B n không v s / m t mô hình i t ng tr c ó.
       B n b t u vi t mã tri n khai các ph ng th c n l. mà ch a v ch ra nh ng nét g c r" c a mô
       hình.
       B n không s d ng n các tên m u hình thi t k khi nói mà úng h n là nói v tri n khai th c
       hi n.
 Thói quen t t: Thêm các                          it        ng, m t cách hài hòa, ph i h p thành m u
 Nói chung, b n ã ngh                     n các m u khi:
       Mô hình hóa các l p và các t ng tác c a chúng s3n t! tr c.
       T o b n m u các l p (stereotype) theo các m u hình c a chúng.
       S d ng các tên m u, nh Factory, Singleton và Facade.
       V ch ra ph n l n g c r" c a mô hình, sau ó b t u thêm tri n khai th c hi n.




 K t lu n
 Xây d ng các thói quen t t OO trong PHP giúp b n xây d ng các ng d ng &n                         nh h n, d" b o trì h n và
 có kh n ng m r ng d" dàng h n. Ghi nh :
       Hãy khiêm t n.
Xây d ng b y thói quen t t v h     ng      it   ng trong PHP                                Page 13 of 14



       Hãy là m t láng gi ng t t.
       Tránh nhìn vào Medusa.
       Gi v ng nguyên t c liên k t y u nh t.
       B n là cao su, tôi là keo dán.
       Duy trì m t gia ình.
       Ngh n các m u.
 Khi b n ã xây d ng và có      c các thói quen này, b n có th b t ng# v các thay &i v ch t l    ng c a
 các ng d ng c a b n.



 Tài nguyên
 H ct p
      ( c m c Module programming trên Wikipedia.

       ( c nhi u h n v thi t k h ng        it   ng trong cu n sách c a Bertrand Meyer có tên là Object-
       Oriented Software Construction .

       Truy c p t i ph n h   ng d n th c hành PHP c a trang Web PHP chính th c trên Classes and
       Objects.

       ( c v Các m u hình thi t k trong PHP trong "Five common PHP design patterns" và "Five more
       PHP design patterns."

       PHP.net là tài nguyên trung tâm cho các nhà phát tri n PHP.

       Xem "Danh sách khuy n khích        c v PHP."

       Duy t qua t t c các n i dung PHP trên developerWorks.

       M r ng các k n ng PHP c a b n b*ng cách xem các tài nguyên d án PHP c a developerWorks
       c a IBM.

       ( nghe ph%ng v n và các cu c th o lu n thú v dành cho các nhà phát tri n ph n m m, hãy xem
       developerWorks podcasts.

       B n mu n s d ng m t c s d li u v i PHP? Xem Zend Core for IBM, m t môi tr #ng phát tri n
       và môi tr #ng s n su t PHP d" cài t, tr n tru, s3n có dùng ngay, có h- tr DB2 V9 c a IBM.

       Theo dõi sát các s ki n k thu t và webcasts c a developerWorks.

       Xem các h i ngh s p t i, các cu c tri n lãm th ng m i, webcasts và các s ki n khác trên kh p
       th gi i ang     c các nhà phát tri n mã ngu/n m c a IBM quan tâm n.

       Truy c p vào Vùng mã ngu/n m c a developerWorks c p nh t r t nhi u d án, các công c và
       các thông tin h ng d n giúp b n phát tri n v i các công ngh mã ngu/n m và s d ng chúng
       v i các s n ph'm c a IBM.

       Theo dõi và tìm hi u v các công ngh mã ngu/n m và IBM và các ch c n ng s n ph'm v i các
       trình di"n m u theo yêu c u mi"n phí c a developerWorks.


 L y s n ph m và công ngh
       (&i m i d án phát tri n mã ngu/n m ti p theo c a b n v i ph n m m dùng th c a IBM, có s3n
          t i v ho c trên a DVD.

       T i v các phiên b n ánh giá s n ph'm IBM, và nh n các s n ph'm ph n m m trung gian và các
       công c phát tri n ng d ng th c hành t! DB2®, Lotus®, Rational®, Tivoli® và WebSphere®.
Xây d ng b y thói quen t t v h     ng   it   ng trong PHP                               Page 14 of 14




 Th o lu n
       Tham gia vào developerWorks blogs và dành tâm trí cho c ng /ng developerWorks.

       Tham gia vào Di"n àn PHP: Phát tri n các ng d ng PHP v i s n ph'm qu n lý thông tin c a IBM
       (DB2, IDS) c a developerWorks.



    ôi nét v tác gi
  Nathan Good s ng t i vùng Twin Cities c a bang Minnesota. V chuyên môn, ông làm công vi c phát
  tri n ph n m m, ki n trúc ph n m m và qu n tr các h th ng. Khi ông không vi t ph n m m, ông r t
  thích xây d ng các máy ch và máy tính cá nhân, c và làm vi c v i các công ngh m i và c g ng
  khuy n khích b n bè c a mình chuy n sang ph n m m mã ngu/n m

Os php-7oohabits

  • 1.
    Xây d ngb y thói quen t t v h ng it ng trong PHP Page 1 of 14 Xây d ng b y thói quen t t v h ng it ng trong PHP M c : Trung bình Nathan A. Good, K s tr ng, t v n, Freelance Developer 13 06 2009 V i các c tính c a ngôn ng h ng i t ng (OO) c a PHP, n u b n còn ch a t o ra các ng d ng c a b n v i các nguyên t c OO (object-oriented) trong tâm trí, thì b y thói quen này s giúp b n b t u quá trình chuy n ti p gi a l p trình th t c và l p trình h ng i t ng. Trong nh ng ngày u c a l p trình PHP, mã PHP ã b gi i h n là ngôn ng theo th t c v b n ch t. Mã theo th t c (Procedural code) mô t cách s d ng các th t c cho các kh i xây d ng c a ng d ng. Các th t c cung c p m t m c tái s d ng nh t nh khi cho phép các th t c c g i b i các th t c khác. Tuy nhiên, dù không có các k t c u c a ngôn ng h ng i t ng, m t l p trình viên v n có th a thêm các c tr ng OO vào trong mã PHP. S có m t chút khó kh n h n và có th làm cho mã khó c h n b i vì nó pha tr n các m u (ngôn ng theo th t c v i thi t k OO gi ). Các k t c u OO trong mã PHP — nh là kh n ng nh ngh a và s d ng các l p, kh n ng xây d ng các m i quan h gi a các l p có s d ng quy n th!a k và kh n ng nh ngh a các giao di n — s làm cho vi c xây d ng mã tuân th các thói quen th c hành OO t t d" dàng h n nhi u. Trong khi các thi t k theo th t c thu n túy không có nhi u tính mô un v n ch y t t, các l i th c a thi t k OO s xu t hi n trong khâu b o trì. B i vì m t ng d ng i n hình s dành r t nhi u th#i gian s ng c a nó cho vi c b o trì, b o trì mã có chi phí r t cao trong su t cu c #i c a m t ng d ng. Nó c$ng có th d" dàng b b% quên trong lúc phát tri n. N u b n ang trong m t cu c ua làm cho ng d ng c a b n c phát tri n và tri n khai, tính d" b o trì v dài h n có th t m lùi xu ng gh sau, hãy cho m t cái gì ó b t u ho t ng ã. Tính mô un (Modularity) — m t trong nh ng c tr ng then ch t c a thi t k OO t t — giúp cho vi c b o trì này. Tính mô un giúp bao gói các thay &i, s làm cho m r ng và s a &i ng d ng theo th#i gian d" dàng h n. Trong khi có nhi u h n b y thói quen xây d ng ph n m m OO v t&ng th , b y thói quen sau ây là nh ng gì b n c n làm cho mã c a b n phù h p v i các tiêu chu'n thi t k OO c b n. Chúng cho b n m t n n t ng v ng ch c nh# ó b n có th b& sung thêm các thói quen OO và xây d ng ph n m m d" dàng c b o trì và c m r ng. Các thói quen nh m t i m t s trong các c tr ng then ch t c a tính mô un. ( bi t thêm thông tin v l i ích c a thi t k OO, c l p v i ngôn ng , xem Tài nguyên. B y thói quen t t v OO trong PHP là: 1. Hãy khiêm t n. 2. Hãy là m t láng gi ng t t. 3. Tránh nhìn vào Medusa. 4. Gi v ng nguyên t c liên k t y u nh t. 5. B n là cao su, tôi là keo dán. 6. Duy trì m t gia ình. 7. Ngh n các m u. Hãy khiêm t n Hãy khiêm t n là tránh t tr ng mình ra trong tri n khai th c hi n các l p và các hàm c a b n. Vi c che gi u thông tin là m t thói quen c b n. B n s có m t th#i gian khó kh n xây d ng b t k) các thói quen nào khác, cho n khi b n ã t p c thói quen che gi u các chi ti t tri n khai th c hi n c a b n. Che
  • 2.
    Xây d ngb y thói quen t t v h ng it ng trong PHP Page 2 of 14 gi u thông tin c$ng c g i là s bao gói (encapsulation). Có r t nhi u lý do t i sao tr c ti p l ra các tr #ng công c ng là m t thói quen x u. (i u quan tr ng nh t trong s ó là nó không l i cho b n m t tùy ch n nào n u m t cái gì ó trong tri n khai th c hi n c a b n thay &i. B n s d ng các khái ni m OO cô l p s thay &i và vi c bao gói óng m t vai trò không th thi u c trong vi c b o m r*ng b t k) s thay &i nào mà b n th c hi n không ph i là m t ki u virút trong t nhiên. Nh ng thay &i ki u Virút là nh ng thay &i b t u là nh% — gi ng nh vi c thay &i m t m ng ch a ba ph n t thành ch+ ch a có hai. ( t nhiên, b n nh n th y r*ng b n ang thay &i càng ngày càng nhi u mã c a b n thích nghi v i m t thay &i l ra là không áng k . M t cách n gi n b t u che gi u thông tin c a b n là gi các tr #ng riêng t (private) và ch+ l chúng thông qua các hàm truy c p công c ng, gi ng nh các c a s& trong nhà b n. Thay vì có toàn b c m t b c t #ng m toang ra bên ngoài, thì b n ch+ có m t ho c hai c a s&. (Tôi nói thêm v hàm truy c p công c ng trong "Thói quen t t: S d ng hàm truy c p công c ng"). Ngoài vi c cho phép các tri n khai th c hi n c a b n di"n ra sau b c màn i v i các thay &i, vi c s d ng nh ng hàm truy c p công c ng thay vì tr c ti p l các tr #ng cho phép b n xây d ng thêm d a trên tri n khai th c hi n n n t ng c a b n b*ng cách è lên (overriding) tri n khai th c hi n c a m t hàm truy c p làm m t cái gì ó h i khác v i hành vi ng x c a cha m,. Nó c$ng cho phép b n xây d ng m t tri n khai th c hi n tr!u t ng (abstract) trì hoãn vi c tri n khai th c hi n th c t các l p è lên n n t ng ã có. Thói quen x u: l các tr ng công c ng Trong ví d mã x u trong Li t kê 1, các tr #ng c a các i t ng Person c l ra tr c ti p nh là các tr #ng công c ng thay vì qua các hàm truy c p. Trong khi hành vi này r t cám d-, c bi t là cho các i t ng d li u ít quan tr ng, thì nó l i h n ch b n. Li t kê 1. Thói quen x u v vi c l các tr ng công c ng !" #$ %# !" #& # !" !" " N u có b t k) i u gì thay &i v i m t i t ng, b t k) mã nào s d ng nó c$ng c n ph i thay &i theo. Ví d , n u h , tên, tên m c a m t ng #i ã c bao b c trong m t i t ng PersonName, b n s c n ph i s a &i t t c các mã c a b n cho phù h p v i s thay &i ó. Thói quen t t: S d ng các hàm truy c p công c ng B*ng cách s d ng các thói quen OO t t (xem Li t kê 2), cùng m t i t ng bây gi# có các tr #ng riêng t thay cho các tr #ng công c ng và các tr #ng riêng t c tr ng ra m t cách th n tr ng v i th gi i bên ngoài b*ng các ph ng th c get và set công c ng, c g i là nh ng hàm truy c p (accessors). Nh ng hàm truy c p bây gi# cung c p m t cách công c ng nh n thông tin t! l p PHP c a b n sao cho n u có thay &i gì trong các tri n khai th c hi n c a b n, thì ít có kh n ng là b n c n ph i thay &i t t c các mã ã s d ng l p y. Li t kê 2. Thói quen t t s d ng nh ng hàm truy c p công c ng '
  • 3.
    Xây d ngb y thói quen t t v h ng it ng trong PHP Page 3 of 14 ' ' ' ' ' ' !" ' ' ' ' !" ' '( ' !" ' '( ' ' !" ' ') ' !" ' ') ' ' !" ' '* ' !" ' '* ' !" ' #$ %# !" '( #& # !" ' !" '( " Tho t nhìn i u này có v. s thêm nhi u công vi c h n và có th th c s là nhi u vi c h n m t tr c. Tuy nhiên, th #ng vi c áp d ng thói quen OO t t s c n bù l i trong lâu dài v sau, b i vì các thay &i trong t ng lai c c ng c ch c ch n. Trong phiên b n mã c hi n th trong Li t kê 3, tôi ã thay &i vi c tri n khai th c hi n bên trong s d ng m t m ng k t h p cho các ph n c a tên. Lý t ng ra, ph i có nhi u x lý l-i h n và ki m tra c'n th n h n xem ph n t ó có t/n t i không, nh ng m c ích c a ví d này là cho th y làm th nào các mã s d ng l p c a tôi không c n ph i thay &i — th t h nh phúc là nó không bi t c v s thay &i l p c a tôi. Hãy nh r*ng lý do ch p nh n các thói quen OO là bao gói c'n th n các thay &i cho mã c a b n có kh n ng m r ng h n và d" b o trì h n. Li t kê 3. M t s a i khác theo thói quen t t này v i vi c tri n khai th c hi n bên trong khác i ' ' ' ' !" +, ,- ' '
  • 4.
    Xây d ngb y thói quen t t v h ng it ng trong PHP Page 4 of 14 ' ' !" +, ,- ' '( ' !" +, ,- ' '( ' ' !" +, ,- ./ ' %%% /. ./ / 0 ' ' ' ' ' 12 ' 1 ' ' / ' % 3 ' 1 ' ' % /. !" ' #$ %# !" '( #& # !" ' !" '( " Hãy là m t láng gi ng t t Khi b n xây d ng m t l p, nó c n x lý l-i riêng c a mình m t cách thích h p. N u l p không bi t làm th nào x lý các l-i, nó c n gói chúng theo m t nh d ng mà ng #i g i nó hi u c. Ngoài ra, tránh tr v các i t ng không t/n t i (null) hay trong tr ng thái không h p l . Nhi u tr #ng h p, b n có th làm i u này n gi n b*ng cách ki m tra các i s và a ra các ngo i l c th nói lý do t i sao các is c cung c p không h p l . Khi b n xây d ng thói quen này, nó có th ti t ki m cho b n — và nh ng ng #i ang b o trì mã c a b n ho c ang s d ng các i t ng c a b n — r t nhi u th#i gian. Thói quen x u: Không x lý các l i Xem xét ví d hi n th trong Li t kê 4, trong ó ch p nh n m t s i s và tr v m t i t ng Person v i m t s các giá tr ã c i n vào. Tuy nhiên, trong ph ng th c parsePersonName() không có xác nh n h p l xem li u bi n $val c cung c p là b*ng null, là m t chu-i ký t có chi u dài b*ng không hay là m t chu-i ký t mà khuôn d ng sai, không phân gi i c. Ph ng th c parsePersonName () không tr v m t i t ng Person mà tr v null. Các qu n tr viên ho c các l p trình viên s d ng ph ng th c này có th ph i vò u b t tai và — ít nh t c$ng là — i n ch- ph i b t u thi t l p các i m ng t và g0 r i k ch b n l nh PHP. Li t kê 4. Thói quen x u không a ra hay không x lý các l i 4' ' ' ' '2 ' #2#2 " 5 ' ' #2#2 .. 6 ' '2 ' !" '( ' +7- !" ') ' +5- ' Ph ng th c parsePersonName() trong Li t kê 4 có th c s a &i kh i t o i t ng Person bên ngoài i u ki n if, khi m b o r*ng b n luôn luôn nh n m t i t ng Person h p l . Tuy nhiên, b n s nh n c m t Person mà các thu c tính còn ch a c thi t l p, i u này c$ng không a b n n m t
  • 5.
    Xây d ngb y thói quen t t v h ng it ng trong PHP Page 5 of 14 v trí t t h n. Thói quen t t: M i mô un x lý các l i riêng c a nó Thay vì m c cho ng #i g i l p c a b n ph%ng oán, hãy ch ng ki m tra tính h p l c a các i s . N u m t bi n ch a thi t l p không th t o ra m t k t qu h p l , hãy ki m tra bi n và a ra m t InvalidArgumentException. N u chu-i ký t không th tr ng r-ng ho c ph i có m t nh d ng c th , hãy ki m tra nh d ng và a ra m t ngo i l . Li t kê 5 bi u th làm th nào t o ra các ngo i l c a riêng b n, c$ng nh m t s i u ki n m i trong ph ng th c parsePerson() gi i thích m t s các xác nh n h p l ban u. Li t kê 5. Thói quen t t a thêm các báo l i 8 1 ) '0 ' ' 1 9 0 ' 4' ' ' ' '2 : ' ' 8 1 ) '0 ' #8 1 '%# : ' ;; ' 5 ' 8 16 '0 ' #$ ' ! ' %# " Dòng d i áy là cái mà b n mu n m i ng #i có th s d ng l p c a b n mà không ph i bi t các ho t ng bên trong c a nó. N u h s d ng nó không úng ho c theo cách mà b n ã không d nh, h không ph i ph%ng oán lý do t i sao nó không ho t ng. V i t cách là m t láng gi ng t t, b n hi u r*ng m i ng #i s d ng l i l p c a b n mà không ph i là các th y bói và do ó b n nên lo i b% vi c ph%ng oán ó. Tránh nhìn vào Medusa Khi tôi l n u tiên h c v các khái ni m OO, tôi ã nghi ng# r*ng các giao di n là th c s có ích hay không. M t /ng nghi p c a tôi ã nêu ra phép so sánh vi c không s d ng các giao di n gi ng nh ang nhìn vào cái u c a Medusa. Trong th n tho i Hy L p, Medusa là m t qu1 cái có b tóc là nh ng con r n. B t k) ng #i nào mà nhìn th2ng vào nó s bi n thành á. Perseus, ng #i ã gi t Medusa, ã có th i phó v i con qu1 b*ng cách nhìn vào hình nh ph n chi u c a nó trong cái khiên c a anh, vì v y không b bi n thành á. Giao di n là t m g ng c a b n i phó v i Medusa. Khi b n s d ng m t tri n khai th c hi n c th , rõ ràng, mã c a b n ph i thay &i n u mã tri n khai th c hi n c a b n thay &i. Vi c s d ng tr c ti p các tri n khai th c hi n s h n ch các tùy ch n c a b n, gi ng nh b n ã bi n các l p c a b n thành á. Thói quen x u: Không s d ng các giao di n Li t kê 6 hi n th m t ví d n p i t ng Person t! m t c s d li u. Nó nh n tên person và tr v i t ng Person phù h p l y t! c s d li u. Li t kê 6. Thói quen x u không s d ng các giao di n <= 1 ' ' 2
  • 6.
    Xây d ngb y thói quen t t v h ng it ng trong PHP Page 6 of 14 ./ ' ' 1 ' 2 ' ' %%% /. !" ' #$ %# !" '( #& # ' ./ 8 1 ' ' 1 ' %%% /. 1 <= 1 1 !" ' #& #2 #< # !" ' !" '( " Mã n p Person t! c s d li u là t t cho n khi có m t s i u gì ó thay &i trong môi tr #ng. Ví d , n p Person t! c s d li u có th là t t cho phiên b n u tiên c a ng d ng, nh ng i v i phiên b n th hai, b n có th c n ph i thêm các kh n ng n p person t! m t d ch v web. V b n ch t, l p ã bi n thành á vì nó ang tr c ti p s d ng l p tri n khai th c hi n và bây gi# r t d" h%ng n u thay &i. Thói quen t t: S d ng các giao di n Li t kê 7 cho th y m t ví d v mã mà s không thay &i khi m t cách n p m i tr thành s3n có cho ng #i s d ng và c tri n khai th c hi n. Ví d cho th y m t giao di n c g i là PersonProvider, có khai báo ch+ m t ph ng th c. N u mã b t k) s d ng PersonProvider, thì mã ó s b ng n c n không c s d ng tr c ti p các l p tri n khai th c hi n. Thay vào ó, nó s d ng PersonProvider gi ng nh ó là m t i t ng th c s . Li t kê 7. Thói quen t t v s d ng các giao di n ' 1 ' ' 2 <= 1 ' 1 ' ' 2 ./ ' 1 ' ' ' 1 ' 2 ' ' %%% /. !" ' #$ %# !" '( #& # ' 1 ) ' ' ' ' ' 1 ' ' ,1 ' , ' <= 1 ' 1 ,1 ' , ./ 8 1 ' ' 1 ' %%% /. 1 1 ) ' >> ' 1 1 !" ' #& #2 #< # !" ' !" '( " Khi b n s d ng các giao di n, c g ng tránh tham chi u tr c ti p n các l p tri n khai th c hi n. Thay vào ó, hãy s d ng m t cái gì ó bên ngoài i t ng c a b n cung c p cho b n vi c tri n khai th c hi n úng. N u l p c a b n n p vi c tri n khai th c hi n d a trên m t s logic, nó v n c n yêu c u các
  • 7.
    Xây d ngb y thói quen t t v h ng it ng trong PHP Page 7 of 14 nh ngh a c a t t c các l p tri n khai th c hi n và i u này s không a b n ti n thêm bao nhiêu. B n có th s d ng m t m u nhà máy (Factory) t o ra m t cá th c a m t l p tri n khai th c hi n giao di n c a b n. M t ph ng th c factory, theo quy c, b t u b*ng vi c t o và tr v m t giao di n. Nó có th nh n b t k) i s nào c n thi t cho ph ng th c factory c a b n tìm ra l p tri n khai th c hi n nào là m t l p úng tr v . Trong Li t kê 7, ph ng th c createProvider() n gi n ch+ dùng m t bi n $type. N u $type c thi t l p là c s d li u, ph ng th c database, s tr v m t cá th c a DBPersonProvider. B t k) vi c tri n khai th c hi n m i n p nhi u Person t! m t kho l u tr không c n b t k) s thay &i nào trong l p có s d ng ph ng th c Factory và giao di n. DBPersonProvider th c hi n giao di n PersonProvider và có tri n khai th c hi n th c t ph ng th c getPerson() bên trong nó. Gi v ng nguyên t c liên k t y u nh t L p ghép l ng các mô un c a b n là m t vi c t t; nó là m t trong các tính ch t cho phép b n óng gói s thay &i. Hai trong s các thói quen khác — "Hãy khiêm t n" và "Tránh nhìn vào Medusa" — giúp b n làm vi c theo h ng xây d ng các mô un c l p ghép l%ng. ( l p ghép l%ng các l p c a b n, hãy phát tri n c tính cu i cùng b*ng cách xây d ng thói quen v vi c làm gi m s ph thu c gi a các l p c a b n. Thói quen x u: L p ghép ch t Trong Li t kê 8, vi c làm gi m s ph thu c không nh t thi t là làm gi m các s ph thu c i v i trình khách s d ng m t i t ng. Thay vào ó, ví d minh ho vi c làm gi m các s ph thu c vào m t l p chính xác và t i thi u s ph thu c này i v i các l p khác. Li t kê 8. Thói quen x u v l p ghép ch t t it ng Address ? @ #%.611 ) '' % # 611 ' 11 9 7 ' 11 9 A ' ' ' ' ' .. %%% ' ' B 1 ' ' ' '611 9 7 7 ' !" 11 9 7 7 ./ 2 ' %%% /. ' 'B ' ' ' !" ' ' ' ' ' # # '' 8 611 ) '' ' # ' # '' $ ' 611 ) '' '' 611 ) '' ' '' !" ' ' !" '611 9 7 2 ' !" '611 9 A 2 ' !" 'B ' 2 ' !" '*' ' 2 ' !" ' ' B 1 2 ' !" 'B '
  • 8.
    Xây d ngb y thói quen t t v h ng it ng trong PHP Page 8 of 14 11 611 11 !" '611 9 7 #7AC 6 *'%# 11 !" '611 9 A #*' A55# 11 !" 'B ' #6 ' # 11 !" '*' ' #6D# 11 !" ' ' B 1 #EEEEE!5555# 11 !" 'B ' #4*# 11 !" ' # ' # #F # 11 !" ' # # #F # " (o n mã g i ph ng th c format() c a m t i t ng Address có th trông r t n t ng — t t c m i vi c mà nó làm là s d ng l p Address, g i ph ng th c format(), và th là xong. Ng c l i, l p Address không may m n nh v y. Nó c n ph i bi t nhi u trình nh d ng (formatters) khác nhau cs d ng nh d ng úng. (i u này có th làm cho i t ng Address không có kh n ng s d ng l i v i nh ng ng #i khác, c bi t là n u m t ng #i nào khác không quan tâm n vi c s d ng các l p c a trình nh d ng trong ph ng th c format(). M c dù mã ang s d ng Address hi n không có nhi u s ph thu c, nh ng l p Address l i có m t s ph thu c, trong khi nó l ra ch+ là m t i t ng d li u n gi n. L p Address c l p ghép ch t v i các l p tri n khai th c hi n bi t cách làm th nào nh d ng m t i t ng Address. Thói quen t t: L p ghép l ng gi a các it ng Khi xây d ng các thi t k OO t t, c n suy ngh v m t khái ni m g i là Phân tách các m i quan tâm (Separation of Concerns-SoC). SoC có ngh a là b n c g ng phân tách các i t ng theo cái mà chúng th c s dính líu n, do ó, làm l%ng vi c l p ghép. Trong l p Address ban u, nó ã ph i quan tâm n vi c làm th nào nh d ng chính nó. (i u ó có l không ph i là m t thi t k t t. Thay vào ó, m t l p Address c n lo l ng v các ph n c a Address, trong khi m t s ki u trình nh d ng lo l ng v vi c làm th nào nh d ng úng các a ch+. Trong Li t kê 9, mã nh d ng a ch+ c di chuy n n các giao di n, các l p tri n khai th c hi n và m t nhà máy (factory) — hãy nh xây d ng thói quen "s d ng các giao di n". Bây gi#, l p AddressFormatUtils có trách nhi m t o ra m t trình nh d ng và nh d ng m t Address. B t k) i t ng khác nào bây gi# có th s d ng m t Address mà không c n ph i lo l ng v vi c ph i có c nh ngh a v các trình nh d ng. Li t kê 9. Thói quen t t v l p ghép l ng gi a các it ng ' 611 ) '' ' ' 11 9 72 11 9 A2 ' 2 ' ' 2 ' B 1 2 ' $ ' 9 611 ) '' ' 611 ) '' ' ' 11 9 72 11 9 A2 ' 2 ' ' 2 ' B 1 2 ' ' ' #G F G F G 2 G G F G #2 11 9 72 11 9 A2 ' 2 ' ' 2 ' B 1 2 ' 8 611 ) '' ' 611 ) '' ' ' 11 9 72 11 9 A2 ' 2 ' ' 2 ' B 1 2 ' ' ' #G G 2 G 2 G G G #2 11 9 72 11 9 A2 ' 2 ' ' 2 ' B 1 2 '
  • 9.
    Xây d ngb y thói quen t t v h ng it ng trong PHP Page 9 of 14 611 ) '4' ' ' ' '611 ' 2 11 '' 611 ) '4' >> ' 611 ) '' ' ' '' !" ' 11 !" '611 9 7 2 11 !" '611 9 A 2 11 !" 'B ' 2 11 !" '*' ' 2 11 !" ' ' B 1 2 11 !" 'B ' ' ' ' ' ' 611 ) '' ' ' # # '' 8 611 ) '' ' # ' # '' $ ' 611 ) '' '' 611 ) '' ' '' 11 611 11 !" '611 9 7 #7AC 6 *'%# 11 !" '611 9 A #*' A55# 11 !" 'B ' #6 ' # 11 !" '*' ' #6D# 11 !" ' ' B 1 #EEEEE!5555# 11 !" 'B ' #4*# 611 ) '4' >> '611 # ' #2 11 #F # 611 ) '4' >> '611 # #2 11 #F # " M t h n ch , t t nhiên, là b t c khi nào s d ng các m u hình s3n, th #ng c$ng có ngh a là s l ng các t o ph'm (các l p, các t p tin) t ng lên. Tuy nhiên, i u này c bù p b*ng vi c gi m công s c b o trì trong m-i l p và có th c gi m nhi u h n n a n u có c kh n ng s d ng l i úng cách. B n là cao su; tôi là keo dán Các thi t k OO k t dính cao là r t t p trung và c t& ch c thành các mô un liên quan. Tìm hi u k "các m i quan tâm" là r t quan tr ng trong vi c xác nh t& ch c các hàm và các l p nh th nào k t dính ch t ch . Thói quen x u: K t dính th p Khi m t thi t k có k t dính th p, nó có các l p và các ph ng th c không c nhóm l i thích h p. Thu t ng mã spaghetti th #ng c s d ng mô t các l p và các ph ng th c c gói chung v i nhau và có k t dính th p. Li t kê 10 cung c p m t ví d v mã Spaghetti. L p t&ng quát Utils s d ng nhi u i t ng khác nhau và có r t nhi u s ph thu c. Nó làm m-i th m t tí, làm cho khó có th s d ng l i. Li t kê 10. Thói quen x u v k t dính th p 4' ' ' ' '611 '3 2 11 72 11 A2 ' 2 ' ' ' # 11 ' # ' ' ' ' '3 2 2
  • 10.
    Xây d ngb y thói quen t t v h ng it ng trong PHP Page 10 of 14 ' # # ' ' ' 611 '3 2 .. ' ' 1 ' 2 ' %%% ' 611 ' ' ' 3 '3 2 .. ' ' 1 ' 2 ' %%% ' 3 " Thói quen t t: Gi v ng nguyên t c k t dính cao K t dính cao có ngh a là các l p và các ph ng th c có liên quan v i nhau c nhóm l i. Khi các ph ng th c và các l p có k t dính cao, b n có th d" dàng tách ra toàn b nhóm mà không nh h ng n thi t k . Các thi t k có k t dính cao t o ra c h i cho l p ghép l%ng. Li t kê 11 hi n th hai trong s các ph ng th c c t& ch c t t h n thành l p. L p AddressUtils có ch a các ph ng th c làm vi c v i các l p Address và cho th y s k t dính cao gi a các ph ng th c có liên quan n a ch+. T ng t , PersonUtils ch a các ph ng th c làm vi c riêng v i các i t ng Person. Hai l p m i này v i các ph ng th c k t dính cao c a chúng s l p ghép l%ng vì chúng có th c s d ng hoàn toàn c l p v i nhau. Li t kê 11. Thói quen t t v k t dính cao 611 4' ' ' ' '611 '3 2 11 72 11 A2 ' 2 ' ' ' # 11 ' # ' ' ' 611 '3 2 .. ' ' 1 ' 2 ' %%% ' 611 4' ' ' ' ' '3 2 2 ' # # ' ' ' '3 2 .. ' ' 1 ' 2 ' %%% ' " Duy trì m t gia ình Tôi th #ng nói v i m i ng #i trong các nhóm ph n m m, mà tôi làm lãnh k thu t o hay ki n trúc s r*ng k. thù l n nh t c a các ngôn ng OO là hành ng sao chép và dán. Khi ch a có thi t k OO chu'n
  • 11.
    Xây d ngb y thói quen t t v h ng it ng trong PHP Page 11 of 14 b tr c, không có gì . ra nhi u l n x n h n là vi c sao chép mã t! m t t p tin này vào t p khác. B t c khi nào mà b n nh sao chép mã t! m t l p này t i m t l p ti p theo, hãy d!ng l i và xem xét làm sao có th s d ng các h th ng th b c c a l p s d ng các ch c n ng t ng t hay gi ng nhau. B n s th y r*ng trong nhi u tr #ng h p, v i thi t k t t, vi c sao chép mã là hoàn toàn không c n thi t. Thói quen x u: Không s d ng h th ng th b c các l p Li t kê 12 cho th y m t ví d n gi n c a các l p b ph n. Chúng b t u v i các tr #ng và các ph ng th c gi ng h t — v lâu dài s không t t khi ng d ng có th ph i thay &i. N u có m t khi m khuy t trong l p Person có nhi u kh n ng c$ng s là m t khi m khuy t trong l p Employee vì nó xu t hi n qua tri n khai th c hi n b*ng cách sao chép gi a hai l p. Li t kê 12. Thói quen x u không s d ng các h th ng th b c ' ' 0 ' ' " Quy n th a k là m t thói quen khó b t u áp d ng vì thông th #ng, vi c phân tích xây d ng các mô hình quy n th!a k úng n có th m t nhi u th#i gian. Ng c l i, s d ng Ctrl+C và Ctrl+V xây d ng m t tri n khai th c hi n m i ch+ m t vài giây. Tuy nhiên, kho ng th#i gian này th #ng r t nhanh c bù p l i trong b o trì, n i ng d ng s th c t tr i qua h u h t ph n #i c a nó. Thói quen t t: S d ng quy n th a k Trong Li t kê 13, l p Employee m i m r ng l p Person Bây gi# nó k th!a t t c các ph ng th c chung và không tri n khai th c hi n l i chúng. Ngoài ra, Li t kê 13 cho th y vi c s d ng m t ph ng th c tr!u t ng gi i thích r*ng ch c n ng c b n có th c a vào m t l p c s và ch c n ng c th h n có th lui l i cho n khi tri n khai th c hi n m t l p. Li t kê 13. Thói quen t t v s d ng quy n th a k ' ' ' ' ' '( ' !" ' '( ' ' !" ' ') ' !" ' ') ' ' !" ' H #H 2 8 # ' !" ' 1 *
  • 12.
    Xây d ngb y thói quen t t v h ng it ng trong PHP Page 12 of 14 ' ' ' ' 1 * 0 ' 1 ' ' 'I ' !" ' 'I ' ' !" ' ' 1 * ' !" 'I % # # % ' !" '( % # # % ' !" ') " Ngh n các m u Các m u thi t k là các t ng tác ph& bi n gi a các i t ng và các ph ng th c mà ã c th#i gian ki m ch ng là gi i quy t t t nh ng bài toán c th . Khi b n ngh v các m u hình thi t k , t c là b n ang b t bu c mình l nh h i vi c các l p t ng tác v i nhau nh th nào. (ó là m t cách d" dàng xây d ng các l p và các t ng tác c a chúng mà không m c ph i các l-i gi ng nh nh ng ng #i khác ã m c ph i trong quá kh và h ng l i t! các thi t k ã c ki m ch ng Thói quen x u: Xem xét m i l n m t it ng Th c s là không có ví d mã thích h p nào gi i thích c ngh n các m u hình là nh th nào (m c dù có nhi u ví d t t cho th y các tri n khai th c hi n theo m u hình). Tuy nhiên, nói chung, b n s bi t b n ang xem xét riêng l. t!ng i t ng m-i l n khi các d u hi u sau ây là úng: B n không v s / m t mô hình i t ng tr c ó. B n b t u vi t mã tri n khai các ph ng th c n l. mà ch a v ch ra nh ng nét g c r" c a mô hình. B n không s d ng n các tên m u hình thi t k khi nói mà úng h n là nói v tri n khai th c hi n. Thói quen t t: Thêm các it ng, m t cách hài hòa, ph i h p thành m u Nói chung, b n ã ngh n các m u khi: Mô hình hóa các l p và các t ng tác c a chúng s3n t! tr c. T o b n m u các l p (stereotype) theo các m u hình c a chúng. S d ng các tên m u, nh Factory, Singleton và Facade. V ch ra ph n l n g c r" c a mô hình, sau ó b t u thêm tri n khai th c hi n. K t lu n Xây d ng các thói quen t t OO trong PHP giúp b n xây d ng các ng d ng &n nh h n, d" b o trì h n và có kh n ng m r ng d" dàng h n. Ghi nh : Hãy khiêm t n.
  • 13.
    Xây d ngb y thói quen t t v h ng it ng trong PHP Page 13 of 14 Hãy là m t láng gi ng t t. Tránh nhìn vào Medusa. Gi v ng nguyên t c liên k t y u nh t. B n là cao su, tôi là keo dán. Duy trì m t gia ình. Ngh n các m u. Khi b n ã xây d ng và có c các thói quen này, b n có th b t ng# v các thay &i v ch t l ng c a các ng d ng c a b n. Tài nguyên H ct p ( c m c Module programming trên Wikipedia. ( c nhi u h n v thi t k h ng it ng trong cu n sách c a Bertrand Meyer có tên là Object- Oriented Software Construction . Truy c p t i ph n h ng d n th c hành PHP c a trang Web PHP chính th c trên Classes and Objects. ( c v Các m u hình thi t k trong PHP trong "Five common PHP design patterns" và "Five more PHP design patterns." PHP.net là tài nguyên trung tâm cho các nhà phát tri n PHP. Xem "Danh sách khuy n khích c v PHP." Duy t qua t t c các n i dung PHP trên developerWorks. M r ng các k n ng PHP c a b n b*ng cách xem các tài nguyên d án PHP c a developerWorks c a IBM. ( nghe ph%ng v n và các cu c th o lu n thú v dành cho các nhà phát tri n ph n m m, hãy xem developerWorks podcasts. B n mu n s d ng m t c s d li u v i PHP? Xem Zend Core for IBM, m t môi tr #ng phát tri n và môi tr #ng s n su t PHP d" cài t, tr n tru, s3n có dùng ngay, có h- tr DB2 V9 c a IBM. Theo dõi sát các s ki n k thu t và webcasts c a developerWorks. Xem các h i ngh s p t i, các cu c tri n lãm th ng m i, webcasts và các s ki n khác trên kh p th gi i ang c các nhà phát tri n mã ngu/n m c a IBM quan tâm n. Truy c p vào Vùng mã ngu/n m c a developerWorks c p nh t r t nhi u d án, các công c và các thông tin h ng d n giúp b n phát tri n v i các công ngh mã ngu/n m và s d ng chúng v i các s n ph'm c a IBM. Theo dõi và tìm hi u v các công ngh mã ngu/n m và IBM và các ch c n ng s n ph'm v i các trình di"n m u theo yêu c u mi"n phí c a developerWorks. L y s n ph m và công ngh (&i m i d án phát tri n mã ngu/n m ti p theo c a b n v i ph n m m dùng th c a IBM, có s3n t i v ho c trên a DVD. T i v các phiên b n ánh giá s n ph'm IBM, và nh n các s n ph'm ph n m m trung gian và các công c phát tri n ng d ng th c hành t! DB2®, Lotus®, Rational®, Tivoli® và WebSphere®.
  • 14.
    Xây d ngb y thói quen t t v h ng it ng trong PHP Page 14 of 14 Th o lu n Tham gia vào developerWorks blogs và dành tâm trí cho c ng /ng developerWorks. Tham gia vào Di"n àn PHP: Phát tri n các ng d ng PHP v i s n ph'm qu n lý thông tin c a IBM (DB2, IDS) c a developerWorks. ôi nét v tác gi Nathan Good s ng t i vùng Twin Cities c a bang Minnesota. V chuyên môn, ông làm công vi c phát tri n ph n m m, ki n trúc ph n m m và qu n tr các h th ng. Khi ông không vi t ph n m m, ông r t thích xây d ng các máy ch và máy tính cá nhân, c và làm vi c v i các công ngh m i và c g ng khuy n khích b n bè c a mình chuy n sang ph n m m mã ngu/n m