Mọi feedback đều được chào đón.
TMK nên chú ý đến khía cạnh tách biệt presentation logic và business
logic. Đó là nguyên nhân chính để trả lời cho câu hỏi tại sao phải
dùng template engine hoặc system.
On Sep 8, 8:40 am, tumickey <tumic...@gmail.com> wrote:
> hi pcdinh ,
> cám ơn về cái slide,
> TMK chưa coi qua Savant mà hiện nay trang chủhttp://phpsavant.com
Với file PDF thì các note và slide nằm trên cùng trang nên dễ đọc hơn.
On Sep 8, 8:40 am, tumickey <tumic...@gmail.com> wrote:
> hi pcdinh ,
> cám ơn về cái slide,
> TMK chưa coi qua Savant mà hiện nay trang chủhttp://phpsavant.com
Những thử nghiệm của tôi cho thấy Smarty chậm hơn giải pháp templating
system từ 80 - 200%. Kể cả khi nó đã được biên dịch thì nó vẫn chậm
hơn 20-30% do kết cấu mã sinh ra phức tạp hơn mà dù đều là PHP (ví dụ:
việc sử dụng cấu trúc mảng đa chiều...). Nếu bạn dùng shared hosting
thì bạn đã thử xóa các file template nó sinh ra chưa :D
Không nên thấy bên Nhật làm vậy thì mình bắt chước. Bắt chước cái khôn
của họ thôi. Smarty năm 2002 là nhanh, nhưng năm 2007 nó là siêu chậm.
Nhưng cái quan trọng ko hẳn là tốc độ mà là cách nhìn sai lầm của
người thiết kế Smarty do những ảnh hưởng từ JSTL, Velocity của Java.
PHP là ngôn ngữ nhúng. Nếu nhúng tất thì có hại, nhúng 1 lượng rất nhỏ
để tận dụng tính thiết kế của nó thì hoàn toàn có lợi. Chính vì thế
các framework hàng đầu hiện nay như Zend Framework, SolarPHP, CakePHP,
Symfony, Phrame, Mojavi/Agavi, Akelos.. đều sử dụng PHP như là
template system. Họ chỉ trừu tượng hóa phần View. Cái quan trọng của
người lập trình PHP là sự hình thành tư duy tách biệt 3 bộ phận trong
một page thành M-V-C chứ không phải là sự ép buộc phải dùng một ngôn
ngữ khác với PHP khiến cho lập trình viên ko có cách nào khác là phải
tách biệt templating code và logic/data manipulation code.
Việc tách biệt templating code và logic/data manipulation code thì mới
chỉ đưa ứng dụng đến mức modular của ASP.NET, một framework mà tôi cho
là khá yếu hay chưa đủ chín về mặt kiến trúc modular trên nền web .
Nếu chỉ dừng mức đó mà cần đến một giải pháp cỡ như Smarty thì tôi cho
là kém hiệu quả.
Smarty chỉ có tác dụng với 1% các dự án PHP khi mà tính năng cá nhân
hóa trên template được sử dụng. Và để tránh tính phức tạp khi các user
ko quen biết nhúng mã PHP độc vào template được submit lên và ko có
một quy trình kiểm soát hiệu quả thì Smarty được ưa chuộng. Phải chăng
là các dự án kiểu đó thì chỉ có Smarty làm được? Sai lầm. PHPSavant có
cơ chế hook một compiler vào engine của nó để dịch các custom tags
kiểu như Smarty tags sang PHP. Nghĩa là bạn có thể xử lý một template
file theo 3 bước
+ Xóa sạch các thẻ PHP được nhúng vào
+ Phân tách các custom tags mà nó detect được và đước phép detect
thành mã PHP
+ Thực hiện việc thay thế và build compiled files như ở Smarty.
Vì các giải pháp templating system dựa trên PHP cho nên nó được được
hỗ trợ về mặt tooling trên các IDE hay Web Authoring Editor như
Dreamweaver còn Smarty thì thường là không (chưa gặp bao giờ). Ví dụ:
tự động phân tích cú pháp lúc coding để thông báo ngay lỗi syntax
error, code completion, code formatting, code highlighting, best
practice recommendator (unused declared variables, index existence
checking..)... Điều này tăng hiệu suất của người lập trình, giảm các
sai sót thường thấy, dễ debug, linh hoạt. Bạn sẽ không còn cần đến cửa
sổ debug của Smarty đó nhìn xem Smarty nó đã parse được những gì nữa.
^_^
Các text code editor có hỗ trợ code hightlight nhưng không hoàn chỉnh.
Chúng không thể highlight theo block. Còn trường hợp syntax error là
trường hợp thường gặp nhưng đã gặp thì việc debug trên template gây
khó chịu hơn nhiều nếu không có IDE. Để phân tích syntax, người ta
phải xây dựng bộ thông dịch ngôn ngữ. Chưa có một IDE nào làm được với
Smarty. Nếu Smarty được viết bằng C thì điều này khả thi hơn. Giống
như Blitz.
Framework của tôi cho phép trừu tượng tầng View thành factory và
driver. Việc thử nghiệm với driver là Smarty và driver là Standard cho
thấy khâu biên dịch bị mất rất nhiều bộ nhớ: tăng từ 200% - 500% bộ
nhớ so với standard, CPU tăng khoảng từ 20 - 80% cao hơn so với
standard tùy theo việc bạn sử dụng vòng lặp phức tạp cỡ nào. Ngay sau
khi biên dịch xong, Smarty vẫn cần có lời gọi hệ thống stat để kiểm
tra sự thay đổi của template gốc. Stat là lời gọi rất tốn kém tài
nguyên. Và như thế nó đã làm giảm performance của compiled template so
với pure PHP template. Khi truy xuất I/O, PHP vẫn phải gọi stat call
nhưng riêng Smarty, nó cần thêm các lời gọi bổ sung để đảm bảo cho mô
hình của nó hoạt động.
Có 2 cách để thực hiện benchmark
+ Dùng microtime trước vào sau khi thực hiện render
+ Dùng microtime cho toàn bộ script cycle khi controller và model là
tối thiểu. Model có thể chỉ dùng một mảng đơn giản.
Để cho chính xác:
+ Gọi đơn lệnh để cho Smarty biên dịch và so sánh
+ Đặt vòng lặp 1 - 1000 cho cac lời gọi sau đó và tính tổng để so
sánh.
Debug trong Smarty ko đơn giản như ở template system. Debug không chỉ
là để đảm bảo cú pháp đúng mà còn là để đảm bảo dữ liệu đầu vào và
hiển thị đầu ra đúng. Về mặt cú pháp, bạn phải dùng mắt thường để ngó
xem bạn đã thiếu 1 cái { hay } ở đâu. Ngoài ra còn việc test dữ liệu.
Công việc này luôn gắn liền với cửa sổ debug của Smarty. Với template
system như PHPSavant thì chúng ta chỉ việc dùng var_dump() hay
print_r() nếu như nghi ngờ có độ vênh giữa Controller và View.
Việc debug dùng IDE là rất cần thiết. Nếu template của bạn đơn giản
thì nói chung giải pháp nào cũng như nhau vì sự khác biệt trong việc
đọc code ko chênh lệch. Tuy nhiên với các vòng lặp phức tạp (nested
loop) thường gặp trong các ứng dụng quản lý quy trình, bạn sẽ thấy sự
khác biệt lập tức. Người design thậm chí có thể populate dữ liệu mẫu
để test design template mà không cần biết tầng Controller và Model.
Nhưng với Smarty thì công việc khó chịu hơn nhiều đấy.
Như tôi đã khẳng định ở trên, Smarty không dẫn đến M-V-C. Vì có cùng
một mục đích nên PHPSavant hay các template system khác cũng vậy. Nó
chỉ tách logic, workflow và data layer ra khỏi vùng presentation giống
như cách tiếp cận tag soup của ASP.NET. Tuy nhiên sự phức tạp và lối
tư duy dùng một ngôn ngữ template dựa trên PHP để thay thế cho PHP,
vốn là một ngôn ngữ được thiết kế để là một ngôn ngữ template thì rõ
ràng là vô cùng có vấn đề. Python có TAL, Ruby có KML nhưng cả 2 ngôn
ngữ này cần dùng đến template engine vì chúng ko phải ngôn ngữ hướng
HTML. Chúng không thể nhúng. Vậy nên template engine như Smarty, KML,
TAL là cho các công nghệ loại này.
Về việc Savant như thế nào mình sẽ nghiên cứu xem, nhưng vừa qua đọc
trang chủ của nó mình cũng đọc đc 1 câu:
"The simple, elegant, and powerful alternative to Smarty."
"Savant is a powerful but lightweight object-oriented template system
for PHP."
"Savant is streams-aware and can use any stream as a template source."
Và search được 1 số site, (có thể các bạn đã biết):
http://cyberzoide.developpez.com/php4/template/
http://phpsavant.com/yawiki/
http://www.sitepoint.com/print/beyond-template-engine
http://en.wikipedia.org/wiki/Web_template_system
http://www.smashingmagazine.com/2006/10/01/html-template-systems-in-php/
http://www.codewalkers.com/c/a/Display-Tutorials/Writing-a-Template-System-in-PHP
http://www.nyphp.org/content/presentations/3templates/whynot/
> ...
>
> read more »