แหล่งรวบรวมขั้นตอนการเขียนโปรแกรม ตัวอย่างโค้ด แนวทางเขียนโปรแกรม เทคนิคต่างๆมากมาย

December 24, 2010

MVC คืออะไร

MVC หรือ Model View Controller เป็นหนึ่งในหลายๆ pattern ของ Design pattern ซึ่งเป็น Model หรือรูปแบบในการวางโครงสร้างโปรแกรมทำให้แยกกันระหว่าง Model, View, Coltroller
  • Model เป็นส่วนควบคุมการเข้าถึงและใช้งานข้อมูล(Data)
  • View เป็นส่วนแสดงผลให้กับผู้ใช้งาน (User Interface)
  • Controller เป็นตัวกลางควบคุมการทำงานของระบบโดยเป็นตัวสั่งให้ Model และ View ทำงานตามความต้องการ

    จากรูป จะแบ่งเป็นขั้นๆดังนี้
  • เริ่มต้นเมื่อ Client เรียก หรือร้องขอ(Request) เข้ามาจะไปที่ Controller ก่อนเพื่อให้ Controller ดูว่าต้องทำอะไรต่อไป 
  • หากมีความต้องการใช้ข้อมูล(Data) Controller จะส่งต่อให้ Model ไปหาข้อมูลมาให้ 
  • แล้วเมื่อ Controller ได้รับข้อมูลที่เตรียมไว้เพื่อแสดงผล(หรือเพื่ออย่างอื่น) แล้ว Controller จะส่งข้อมูลไปให้ View
  • View ทำการแสดงผลให้กับ Client
จะสังเกตุได้ว่าการทำงานแบ่งออกเป็นส่วนๆ ชัดเจนมากขึ้นเมื่อเทียบกับการทำงานที่รวมทุกอย่างไว้ด้วยกัน (เช่น เขียนโปรแกรมที่มีการดึงข้อมูลจาก database และแสดงผลรวมกันในไฟล์เดียว) MVC จึงช่วยให้การปรับปรุงแก้ไข หรือ พัฒนาเพิ่มเติมได้โดยไม่มีผลกระทบไปยังส่วนอื่นๆ
 ยกตัวอย่าง การทำงานของ Hardware เพื่อให้เห็นภาพการทำงานมากขึ้น เช่น คอมพิวเตอร์ 1 เครื่องนั้น ถ้าต้องการให้คอมพิวเตอร์นั้นประมวลผลเร็วขึ้นก็สามารถที่จะถอด CPU ตัวเก่า แล้วนำ CPU ตัวใหม่มาเสียบ แล้วใช้ต่อได้เร็วกว่าเดิม ต้องการให้การแสดงผลที่ดีขึ้นก็เปลี่ยนการ์ดจอ แต่ขอบเขตคือต้องอยู่ในสิ่งที่ mainboard รับได้ด้วย เราจะทำยังไง ซึ่งเป็นอะไรที่ยากมากเพราะจะต้องใช้สถาปัตยกรรมหรือแนวคิดของ Software ที่ดีด้วยซึ่ง MVC ก็ทำได้ เช่น ถ้าเราต้องการ Control ใหม่ให้ได้ผลลัพท์เหมือนเดิม แล้วเอาไปเสียบที่เดิม ก็เสร็จ ทำให้ไม่ต้องมาสนใจ View และ Model เป็นต้น

..อ่านต่อ..

December 15, 2010

Basic Agile Development

เป็น slide อธิบาย concept agile สั้นๆ ให้ได้เข้าใจกันง่ายนะครับ
จากที่นี่ http://agilemanifesto.org กล่าวเกี่ยวกับ Agile ไว้ว่า...

จากทั้งการลงมือทำเองจริง(ไม่ได้นั่งเทียน)และช่วยคนอื่นทำ
พวกเราได้เห็นแจ้งถึงแนวทางในการพัฒนาซอฟต์แวร์ที่ดีกว่า
ประสบการณ์เหล่านี้ ทำให้เราตระหนักว่าเราต้อง

ให้ความสำคัญกับตัวผู้ทำงานและการปฎิสัมพันธ์ระหว่างผู้ทำงาน
มากกว่าการ(สักแต่ว่า)ทำตามขั้นตอนและเครื่องมือที่(คนไม่เคยได้ทำ)กำหนดไว้

ให้ความสำคัญกับ(การส่งมอบ)ซอฟต์แวร์ที่นำไปใช้งานได้จริง
มากกว่าการทำเอกสาร(ที่ไม่มีใครอ่าน)

ให้ความสำคัญกับการทำงานร่วมกับลูกค้า(เพื่อเข้าใจสิ่งที่ลูกค้าต้องการจริงๆ)
มากกว่า การต่อรองให้งานเป็นไปตามสัญญาที่ร่างไว้

ให้ความสำคัญกับการตอบรับกับการเปลี่ยนแปลง
มากกว่าการ(ดันทุรัง)ทำตามแผน

ทั้งนี้ เราก็ยังควรจะให้ความสำคัญกับสิ่งที่กล่าวไว้ทางด้านขวาอยู่
เพียงแต่สิ่งที่กล่าวไว้ทางด้านซ้ายนั้นมีความสำคัญกว่า

จากข้างบนจะเห็นว่า Agile ไม่ใช่ process แต่มองว่าต้องให้ความสำคัญกับคนมากกว่า process

..อ่านต่อ..

December 14, 2010

คำสั่ง Continue ใน PHP


    Continue จะคล้าย ๆ กับ break นั่นคือ จะหยุดการทำงานใน loop ปัจจุบันเอาไว้ก่อน แต่จะต่างจาก break ตรงที่ว่า continue จะกลับไปเริ่มต้นทำงานใหม่ ที่ต้นของ loop แทนที่จะออกจาก loop ไปเลย



Code :

< ?
…
$I = 0;
while ( $i < 10) {
          if ($arr[$i] == “stop”) {
                      continue;
          }
          $i++;
}
…
? > 
จากตัวอย่าง ไม่ว่าค่า $i จะเป็นค่าเท่าไหร่ ถ้าข้อมูลใน array $arr[] เป็น stop เมื่อไหร่ ก็จะหยุดทำงานของการวนรอบนั้น ๆ ทันที

..อ่านต่อ..

ข้อแตกต่างของ exit() และ die()

    ข้อแตกต่างของ exit() และ die() นะครับ ลักษณะการทำงานนั้นเหมือนกัน คือ ออกจากคำสั่ง แต่วิธีการใช้งานต่างกัน
     die() สามารถที่จะใส่ข้อความเข้าไปได้ เช่น die(''เกิดข้อผิดพลาด ระบบได้ออกจากคำสั่ง") ;
     exit() ไม่สามารถทำได้ เหมือน die();

    ..อ่านต่อ..

    53 เทคนิคการเขียน PHP ให้ถูกต้องและ ประมวลผลได้เร็วขั้นสุด

    1. echo เร็วกว่า print ก็แน่นอนครับ เพราะว่า echo เป็น function ที่เรียบง่ายมากกว่า แต่ว่ากลับกัน print มันทำอะไรได้มากกว่า ก็เลยช้ากว่านั่นเอง
    2.เวลาใส่ตัวหนังสือ หรือข้อความให้ใส่ใน ' ' จะเร็วกว่า ใส่ใน " " เพราะว่าเครื่องหมาย "..." มันจะทำการค้นหาตัวแปรที่อยู่ภายในก่อน
    3.ใช้คำสั่ง sprintf แทนที่จะยัดตัวแปรลงไปตรงๆ จะทำให้เร็วขึ้น 10เท่า!!
    ลองดูวิธีใช้ htttp://th.php.net/sprintf ไม่ยากครับ
    4.เรียกใช้ echo หลายครั้ง จะเร็วกว่าการเสียเวลาเพื่อเชื่อมตัวหนังสือก่อนเรียก echo ครั้งเดียว เช่นเชื่อมด้วย $tmp .= 'xxx'; เป็นต้นครับช้า อย่าทำ
    5.ในกระบวนการ loop ควรคำนวนค่าต่างๆเอาไว้ก่อนเท่าที่ทำได้ เช่น
    1for($x=0;$x count($array);$x)

    เราควรเปลี่ยนมาใช้
    1$max count($array);
    ก่อน ค่อยเอาค่า$max ไปใช้ เพราะว่ามันจะเสียเวลาคำนวนรอบเดียวเท่านั้น

    6.พยายามตรวจสอบตัวแปร array ถ้ามีค่าไหนไม่ได้ใช้ก็ unset ทิ้งไปบ้าง อันนี้หลายคน ตัวแปรเกลื่อนระบบ เปลืองแรมครับ ตรวจสอบได้จาก print_r($array); นะครับ
    7.พยายามอย่าเรียกใช้ function พิเศษ เช่น __get, __set, __autoload
    8.เรียกใช้ require() แทนที่จะใช้ require_once() เท่าที่จะเป็นไปได้ ก็เพราะว่า require_once มันจะเสียเวลาตรวจสอบก่อน ว่าไฟล์นี้เคยโหลดเข้ามาหรือยัง ถ้าโหลดแล้วจะไม่โหลดซ้ำ
    9.ใช้ Full path ในการ include หรือ require เพื่อลดเวลาการค้นหา path ของ OS ที่รัน full path ของไฟล์ที่กำลังทำงานเรียกได้จาก dirname(__FILE__);
    10. require() และ include() มันทำงานได้เหมือนกันเลือกใช้ให้ตรงตามความต้องการ มันต่างตรงที่ว่า require() ถ้าไม่พบไฟล์ มันก็หยุดทำงานเลย ความเร็วที่ได้แทบไม่ต่าง
    11. ตั้งแต่ PHP5 เวลาจุดเริ่มต้นของการ ประมวลผล จะเรียกได้จาก $_SERVER[’REQUEST_TIME’] ไม่ต้องเรียกใช้ time() หรือ microtime() ตอนนี้ น่าจะ php5 กันแทบทุกที่แล้วมั้งครับ ไม่มั่นใจลองใช้ phpinfo();
    12. PCRE regex ทำงานได้เร็วกว่า EREG แต่จะเห็นผลเมื่อใช้ในแบบ native function
    13.เมื่อจะประมวลผล XML ใน php ใช้ xml2array จะเป็นการเรียกใช้ PHP XML function และสำหรับ HTML  สามารถเรียกใช้ PHP's DOM document หรือ DOM XML ใน PHP4
    14.str_replace ทำงานได้เร็วกว่า preg_replace แต่บางครั้ง strtr ก็ทำงานได้เร็วกว่าถ้าต้องใช้กันตัวหนังสือเยอะๆ และเราจะใช้ array() ในการทำงานของ str_replace จะทำให้ทำงานได้เร็วกว่าการเรียก str_replace หลายรอบ
    15. statement else if ทำงานได้เร็วกว่า select statement หรือว่า case/switch เพราะว่า else if เป็นคำสั่งเงื่อนไขที่ simple ที่สุดแล้วครับ
    16.การปิด error ด้วย @ ทำให้ทำงานได้ช้ามาก เจอบ่อยมาก @mysql_connect แต่ว่า บางครั้ง ก็ปิดเพื่อความปลอดภัยครับ
    17.การจะลด bandwidth ให้เรียกใช้ mod_deflate ใน apache 2 และ mod_gzip ใน apache1อันนี้ก็ต้องดูว่า server ที่ใช้งานรองรับหรือไม่
    18.ปิดการเชื่อมต่อกับ database เมื่อทำงานเสร็จทุกอย่าง เพื่อให้เหลือ connection ว่างสำหรับรองรับการทำงานต่อไป และเป็นการคืน ทรัพยากรกลับเข้ามาด้วย
    19.$row['id'] เร็วกว่า $row[id] 7เท่า เพราะว่าถ้าเราไม่ใส่เครื่องหมาย มันจะเสียเวลาทำความเข้าใจ index ว่าหมายความว่าอะไร ใน php5 มันจะ error แบบเห็นชัดเลย ถึงแม้ว่าเป็นตัวเลขก็ใส่ไว้ครับ เพื่อความเคยชิน
    20.ใช้ <?php ... ?> tag เมื่อเราจะใช้ PHP แทนการเรียกใช้แบบอื่นๆ รวมทั้งการใช้ short tag ด้วย<? ... ?> อย่างนี้พยายามเลี่ยงครับ
    21.เขียนโค้ดให้ถูกต้องตามไวยากรณ์ เพื่อลด error ที่จะเกิดขึ้น ซึ่งหลายครั้งมันเป็นเพียง notice หรือ warning เท่านั้น จะทำให้ลด over head ไปได้ หรือว่าลองเปิด error_reporting(E_ALL) เพื่อให้เห็น error แบบเต็มๆเปิดไว้เถอะครับ เขียนให้ถูกต้องเสมอ อย่าซ่อนขยะใต้พรม
    22.การแสดงผลแบบ PHP ทำให้หน้าเว็บช้ากว่า static page 2-10 เท่า (ใน apache httpd) ดังนั้น ใช้ php เท่าที่จำเป็น ถ้าหน้าไหนเป็น static ก็ใช้ .html ไปเลย
    23.PHP script จะต้องถูกประมวลผลทุกๆครั้งที่มีการเรียกใช้หน้าเว็บ ถ้าไม่มี cache ดังนั้นควรหาระบบ cache มาใช้(เช่น memcached, eAccelerator , Turck MMCache) เพื่อเพิ่มประสิทธิภาพการทำงานได้ 25-100% เพราะว่าจะลดเวลาการประมวลผลลงได้ นอกจากนี้ยังมีพวกที่ทำ file cache ด้วยนะครับ คือประมวลผลเสร็จ เก็บผลที่ได้เป็นไฟล์เลย
    24.ใช้เทคนิคการทำ cache แบบอื่นๆสำหรับหน้าเว็บที่ไม่ได้มีการเปลี่ยนแปลงมากนัก การทำ cache มันจะเหมือนการแสดงผล HTML ออกหน้าเว็บธรรมดา ลองใช้พวก Smarty หรือ Cache Lite ดู การทำ cache จะได้ผลดีสำหรับเว็บที่มี traffic มาก เปิดเว็บเยอะ หรือการเปิดแต่ละครั้งต้องใช้การประมวลผลอย่างหนัก
    25.พยายามใช้ isset แทนการใช้ strlen เช่น
    1if (strlen($foo) < 5) { echo “Foo is too short”;}
    ก็ควรเปลี่ยนมาเป็น
    1if (!isset($foo{5})) { echo “Foo is too short”; }
    อย่างน้อยก็ลดการใช้ strlen ได้เลยล่ะ
    26.++$i เร็วกว่า $i++ หรือว่า การเพิ่มค่าก่อนนำไปใช้นั่นเอง
    27.พยายามใช้ function ต่างๆที่ php มีให้เรา อย่าเขียน function มาใช้งานเอง แต่ถ้าว่างมาก ก็ไปเขียน C extension หรือ module ให้รู้แล้วรู้รอดไปเลย อันนี้ออกแนวเหน็บๆ แต่ก็จริง เพราะว่าถ้าเป็น C extension หรือ php module มันก็ทำงานได้เร็วกว่า php function ที่เราเขียนมาแน่นอน
    28.พยายามตรวจสอบการทำงานของโค้ดของคุณ เพื่อจะได้รู้ว่า ทำงานหนักมากน้อยขนาดไหน หรือใช้พวก Xdebug debugger ช่วยตรวจสอบภาพรวมก็ได้ถ้าเจอตัวแปรเหลือๆก็ unset ทิ้งตามระเบียบ
    29.เขียน document ให้โค้ดที่ตัวเองเขียนด้วย หลายครั้งกลับมาดูของตัวเอง แล้วมึนก็บ่อยไป โดยเฉพาะคนที่ไม่ได้ใช้ frame work ซึ่งมีอิสระในการเขียนโค้ด มักจะเจอประจำ
    30.หมั่นศึกษาการเขียนโค้ดในแบบที่ดี และแบบที่ผิดๆเอาไว้ ที่ต้องศึกษาแบบที่ผิด เราจะได้รู้ว่าแบบนี้ผิด และไม่ควรทำนั่นเอง
    31.พยายามเขียนโค้ดให้ตรงตามมาตรฐานให้มากที่สุด มันจะช่วยให้คนอื่นอ่านแล้วเข้าใจ รวมทั้งตัวเองด้วยเคยเจอเขียนแบบสับขาหลอกตัวเองมาแล้ว
    32.พยายามแยกส่วนโค้ดออกมา ให้ php แยกจาก HTML มากเท่าที่จะเป็นไปได้ เพราะว่าการเอาไปปนกันหมดนั้นมันจะทำให้งงมาก
    33.อย่าใช้ระบบ template ที่ซ้ำซ้อนเช่นพวก smarty โดยไม่จำเป็น php เองก็มี function ที่ทำงานคล้ายกัน ลองดู ob_get_content และ exact
    34.อย่าวางใจ ข้อมูลที่ได้มาจากการป้อนของ user เช่น form $_POST ให้ใช้ mysql_real_escape_string เมื่อใช้ mysql และ htmlspecialchars เมื่อแสดงผล HTML
    35.ด้วยเหตุผลด้านความปลอดภัย ไม่ควรแสดง path , extension และ configuration สู่สาธารณะ เช่นการ แสดง error หรือ phpinfo() ใน webroot
    36.ปิดการทำงานของ register_globals ไม่มีสคริปไหนในงานจริงที่เปิดใช้กันหรอก มีแต่สคริปแย่ๆและเก่าๆเท่านั้น อีกทั้ง register_globals ก็จะไม่มีอีกแล้วให้ php6 แต่ก็แปลก หนังสือสอน php ภาษาไทยส่วนใหญ่ชอบสอนให้ใช้ เซ็งจริงๆ
    37.ควรเก็บรหัสผ่าน มากกว่าเป็นตัวหนังสือดิบๆ อย่างน้อยควรเอารหัสผ่านไปเข้ารหัสเช่น MD5 หรือ sha1 ก็ได้นะ
    38.ใช้ ip2long() และ long2ip() เพื่อแปลงค่า ip v4 ให้เป็นเลขชนิด long แทนที่จะเก็บเป็น text ใน database ขนาด database ต่างกันชัดเจน
    39.ควรศึกษารายละเอียดที่เกี่ยวกับ PEAR ให้ดี เพราะว่าจะทำให้โค้ดมีมาตรฐานที่ดีมากขึ้น
    40.เมื่อใช้ header('Location:'.$url); จำไว้เสมอว่าต้องตามด้วยคำสั่ง die(); เพื่อป้องกันการหลุดของคำสั่ง เพราะหลายกรณีโดน hack แล้วก็โดนควบคุมให้ทำงานในแบบที่คิดไม่ถึงเลย (ถ้าไม่ die(); php จะทำงานเลยไปด้วยนะครับ)
    41.ใน OOP ถ้า method ใดเป็นชนิด static method ก็ให้ประกาศเป็นชนิด static ไปเลย จะทำให้เร็วขึ้นอีก 4 เท่า
    42.การเพิ่มค่าตัวแปรใน local OOP method นั้นเร็วที่สุด ใกล้เคียงกับการเรียก ตัวแปร local ของ function และการเพิ่มค่าตัวแปรแบบ globla ช้าเป็นเท่าตัวเมื่อเทียบกับ local
    43.การเพิ่มค่าของ object property (เช่น $this->prop++) ช้าเป็น 3 เท่าเมื่อเทียบกับ local variable
    44.การเพิ่มค่าให้กับตัวแปร local ที่ไม่ได้ประกาศไว้ก่อน ทำให้ช้ากว่าปกติ 9-10 เท่าเมื่อเทียบกับการประกาศไว้ก่อน
    45.การสร้างตัวแปร global แม้ว่าจะไม่ได้เอาไปใช้ใน function ก็ทำให้ช้าลง เพราะว่า php จะออกไปเช็คตัวแปร global ที่มีอยู่เสมอ
    46.จำนวน method ที่เพิ่มขึ้น ไม่ส่งผลต่อ performance (ถ้าใช้งานเท่าเดิม)
    47.method ใน derived classes ทำงานได้เร็วกว่า base class
    48.function ที่รับ 1 parameter แต่ใน function ว่างเปล่ามีลักษณะเหมือน การทำงาน $localvar++ 7-8 ครั้ง และถ้าเป็น method ลักษณะนี้ ก็เปรียบกับ $localvar++ 15 ครั้ง
    49.ไม่จำเป็นต้องทำทุกอย่างเป็น OOP มันจะทำให้เกิด overhead และ method, object จะทำให้เปลือง memory
    50.อย่าวางใจ ข้อมูลที่ได้มาจากการป้อนของ user เช่น form $_POST ให้ใช้ mysql_real_escape_string แทนการใช้ mysql_escape_string หรือ addslashs แต่ถ้า เปิด magic_quotes_gpc ไว้ ก็ให้ใช้ stripslashes ไว้ก่อน
    51.ระวังโดน header injection กับ function mail() form mail ที่หลายคน copy ตามเว็บมาใช้ มักจะโดนเอาไว้ใช้เป็นช่องทางส่ง email spam โดยที่เจ้าของเว็บไม่รู้ตัวเสมอๆ
    52.unset ตัวแปรของ database (อย่างน้อยที่สุดก็ password) ไม่จำเป็นตั้งใช้ หลังจากการเชื่อมต่อ เรียบร้อยแล้ว
    53.RTFM! ซะ แปลว่า Read The Fucking Manual หรือ อ่านคู่มือหน่อย อ่านได้ที่ http://th.php.net มีคำบรรยาย พร้อมตัวอย่างมากมาย

    credit: meewebfree.com

    ..อ่านต่อ..