portaldacalheta.pt
  • หลัก
  • การจัดการวิศวกรรม
  • Kpi และ Analytics
  • เทคโนโลยี
  • ว่องไว
เทคโนโลยี

Buggy CakePHP Code: 6 ข้อผิดพลาดที่พบบ่อยที่สุดนักพัฒนา CakePHP ทำ



CakePHP เป็นเฟรมเวิร์ก PHP ที่น่าทึ่ง แต่มันมีช่วงการเรียนรู้ที่สูงชัน! ต้องใช้การวิจัยและการฝึกอบรมที่ดีเพื่อที่จะเป็นผู้เชี่ยวชาญ

ฉันโชคดีที่ใช้ CakePHP มานานกว่า 7 ปีแล้วและในช่วงเวลานั้นฉันได้รับเกียรติจากการทำงานกับหลาย ๆ สมาชิกของชุมชน CakePHP .



ในบทช่วยสอน CakePHP นี้ฉันต้องการอธิบายแนวทางปฏิบัติที่ไม่ดีบางประการที่ฉันได้เห็นในช่วงหลายปีที่ผ่านมาและเสนอแนวทางที่ถูกต้องเพื่อหลีกเลี่ยงข้อผิดพลาดเหล่านี้ นี่ไม่ได้หมายความว่าโค้ดของฉันสมบูรณ์แบบ แต่ในฐานะโปรแกรมเมอร์เราเรียนรู้อยู่เสมอดังนั้นจึงเป็นเรื่องสำคัญที่จะต้องปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดและปรับเปลี่ยนเมื่อคุณเรียนรู้!



เนื้อหาของบทความนี้ได้รับแรงบันดาลใจจากโพสต์จาก CakeCoded . หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ CakePHP โปรดไปที่ส่วนการเรียนรู้ของเรา ที่นี่ .



บทช่วยสอน CakePHP สำหรับผู้เริ่มต้นนี้จะช่วยให้คุณหลีกเลี่ยงการทอดโค้ด CakePHP ด้วยข้อผิดพลาดและความผิดพลาด!

ข้อผิดพลาดทั่วไป # 1: ไม่ปฏิบัติตามอนุสัญญาการเข้ารหัส CakePHP

รูปแบบการเข้ารหัส CakePHP สามารถเป็นได้ ดูที่นี่ . ฉันจะเน้นบางสิ่งที่ฉันมักจะสังเกตเห็นเมื่อดูโค้ดของโปรแกรมเมอร์คนอื่น ๆ



โครงสร้างการควบคุม บ่อยครั้งที่คุณเห็นโปรแกรมเมอร์ทำสิ่งนี้ผิดและในบางกรณีก็นำแนวทางปฏิบัติจากภาษาเขียนโค้ดอื่น ๆ CakePHP ต้องการไวยากรณ์ต่อไปนี้:

if ((expr_1) || (expr_2)) { // action_1; } elseif (!(expr_3) && (expr_4)) { // action_2; } else { // default_action; }

ควรมีช่องว่าง 1 (หนึ่ง) ก่อนวงเล็บแรกและ 1 (หนึ่ง) ช่องว่างระหว่างวงเล็บสุดท้ายและวงเล็บเปิด ดังนั้นหมายความว่าสิ่งต่อไปนี้ไม่ถูกต้อง:



if($this->request->data){ }

สังเกตระยะห่างระหว่าง if และ ( และระหว่าง ) และ {

วิธีการสร้างแนวคิด

ใช้วงเล็บปีกกาในโครงสร้างควบคุมเสมอแม้ว่าจะไม่จำเป็นก็ตาม ช่วยเพิ่มความสามารถในการอ่านโค้ดและทำให้คุณมีข้อผิดพลาดทางตรรกะน้อยลง



ตัวอย่างเช่นสิ่งต่อไปนี้ไม่ถูกต้อง:

if ($foo) $bar = true

ควรมีรูปแบบดังนี้:



if ($foo) { $bar = true }

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

ตัวอย่างที่ไม่ถูกต้องมีดังนี้



if ($foo) { $bar = true; }

สิ่งนี้ไม่ถูกต้องวงเล็บเปิดควรอยู่ในบรรทัดแรก:

if ($foo) { $bar = true; if ($action) { $to = false; } }

การเยื้องต้องจัดเรียงให้ถูกต้อง

ฉันมักจะได้ยินโปรแกรมเมอร์พูดว่า“ แต่ฉันยุ่งเกินกว่าจะเขียนโค้ดให้เรียบร้อย….” คำตอบของฉันคือ“ เชื่อฉันเถอะรหัสที่เรียบร้อยจะยืนหยัดการทดสอบของเวลา” การเขียนโค้ด CakePHP ซึ่งไม่สามารถอ่านได้จะเป็นฝันร้ายที่จะกลับมาหากคุณต้องการเปลี่ยนแปลงในอีกไม่กี่เดือน

ข้อผิดพลาดทั่วไป # 2: การใช้พฤติกรรมที่ไม่เหมาะสมและระดับการเกิดซ้ำใน ORM

ฉันโชคดีเมื่อเร็ว ๆ นี้ที่ได้พูดคุยอย่างไม่เป็นทางการกับผู้พัฒนาฐานข้อมูลจาก Facebook เราเริ่มพูดคุยเกี่ยวกับ CakePHP และเขาก็พูดกับฉันว่า 'โอ้นั่นใช้ ORM ไม่ใช่เหรอ นั่นอาจเป็นเรื่องน่ากลัว” ฉันถามเขาว่าเขาหมายถึงอะไรและเขาแสดงความคิดเห็นว่าด้วย Object-relational mapping (ORM) มันเป็นเรื่องง่ายสำหรับการสืบค้น SQL ที่มีขนาดใหญ่โดยไม่จำเป็น

เขาถูกต้องในทาง ความมหัศจรรย์ส่วนหนึ่งของ CakePHP อยู่ที่การใช้ ORM และวิธีการจัดกลุ่มความสัมพันธ์ของตารางฐานข้อมูลต่างๆเข้าด้วยกัน โดยค่าเริ่มต้น CakePHP จะเลือกข้อมูล 'Belongs To', 'Has One' และ 'Has Many' ที่เกี่ยวข้องโดยอัตโนมัติและอาจนำไปสู่การสืบค้น SQL ที่มีขนาดใหญ่มาก คำค้นหาเหล่านี้อาจไม่น่ากังวลเมื่อคุณกำลังพัฒนาแอปพลิเคชันในตอนแรก แต่หลังจากรวบรวมข้อมูลจริงเป็นเวลา 6 เดือนคุณอาจพบว่าแอปพลิเคชันทำงานช้ามากและในบางกรณีอาจขัดข้องหากไม่ได้รับการปรับปรุงให้เหมาะสม

ฉันมองหาสองสิ่งเมื่อตรวจสอบเว็บไซต์ที่มีอยู่ ประการแรกระดับการเรียกซ้ำเริ่มต้นมีการเปลี่ยนแปลงหรือไม่? โดยค่าเริ่มต้น CakePHP จะตั้งค่าระดับการเรียกซ้ำเป็น 1 ซึ่งในความคิดของฉันสูงเกินไป ฉันมักจะตั้งค่าเป็น -1 จากนั้นใช้พฤติกรรมที่สามารถควบคุมได้เพื่อรับโมเดลที่เกี่ยวข้อง

นั่นนำไปสู่สิ่งที่สองที่ฉันมองหา - มีการใช้พฤติกรรมคอนเทนเนอร์หรือไม่? ฉันมักจะมีลูกค้าใหม่มาหาฉันและบอกว่า CakePHP ทำงานช้า สาเหตุเกือบตลอดเวลาเพราะไม่ได้ใช้งาน Containable! โปรแกรมเมอร์ CakePHP ที่ดีจะปรับการสืบค้น SQL ให้เหมาะสมไม่ว่าจะทำงานเบื้องหลัง 'มายากลอัตโนมัติ' มากแค่ไหนก็ตาม

ไม่ได้เพิ่มพฤติกรรมที่สามารถควบคุมได้จนกว่า CakePHP 1.2 แต่เด็กชายได้สร้างความแตกต่างหรือไม่! อย่าลืมใช้ containable ให้ได้มากที่สุดเนื่องจากเป็นวิธีที่มีประสิทธิภาพในการปรับแต่ง SQL ของคุณให้เหมาะสม สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีปรับใช้และใช้พฤติกรรมคอนเทนเนอร์ คลิกที่นี่ .

ข้อผิดพลาดทั่วไป # 3: การรักษาตรรกะทางธุรกิจในตัวควบคุมแทนที่จะเป็นแบบจำลอง

โค้ด CakePHP ที่ดีจะมีตรรกะในไฟล์โมเดล วิธีนี้ใช้เวลาในการทำความคุ้นเคย แต่เมื่อเชี่ยวชาญแล้วจะไม่มีการมองย้อนกลับไป! ควรใช้ไฟล์คอนโทรลเลอร์สำหรับสิ่งที่มีไว้สำหรับรูปแบบ MVC - การควบคุม! ดังนั้นใช้ไฟล์คอนโทรลเลอร์ของคุณเพื่อจัดการการกระทำของผู้ใช้ในขณะที่ปล่อยให้ตรรกะทางธุรกิจไปอยู่ในไฟล์โมเดล

ตัวอย่างที่ดีของเรื่องนี้คือ CRUD ธรรมดา ๆ ซึ่งเป็นการกระทำในชีวิตประจำวัน! ลองใช้ฟังก์ชันเพิ่มโพสต์จากบทช่วยสอนของบล็อกเป็นตัวอย่าง ฟังก์ชันเพิ่มเริ่มต้นมีดังนี้:

public function add() { if ($this->request->is('post')) { $this->Post->create(); if ($this->Post->save($this->request->data)) { $this->Session->setFlash(__('Your post has been saved.')); return $this->redirect(array('action' => 'index')); } $this->Session->setFlash(__('Unable to add your post.')); } }

การดำเนินการของคอนโทรลเลอร์นี้ใช้ได้ดีสำหรับการเพิ่มแบบธรรมดา แต่จะเกิดอะไรขึ้นหากคุณต้องการทำสิ่งต่างๆเช่นส่งอีเมลไปยังผู้ดูแลระบบเมื่อมีการเพิ่มโพสต์หรืออัปเดตการเชื่อมโยงโมเดลอื่นเมื่อมีการเพิ่มโพสต์ นี่เป็นตรรกะเพิ่มเติม แต่ตรรกะนี้ไม่ควรเข้าไปในไฟล์คอนโทรลเลอร์ของเรา

แต่เราจะเขียนฟังก์ชันสำหรับสิ่งนี้ใน Post.php ของเรา แบบ. อาจจะเป็นเช่นนี้:

public function addPost($data = array(), $emailAdmin = true) { $this->create(); $this->save($data); // update any other tables // send the email to the admin user if ($emailAdmin) { } // if all is successful return true; }

จากนั้นจะส่งผลให้เกิดการเปลี่ยนแปลงเล็กน้อยในการกระทำของคอนโทรลเลอร์ดังนี้:

public function add() { if ($this->request->is('post')) { if ($this->Post->addPost($this->request->data)) { $this->Session->setFlash(__('Your post has been saved.')); return $this->redirect(array('action' => 'index')); } $this->Session->setFlash(__('Unable to add your post.')); } }

อย่างที่คุณเห็นการกระทำใหม่เป็นบรรทัดน้อยลงหนึ่งบรรทัดเนื่องจาก $this->Post->create() ถูกย้ายไปยังไฟล์โมเดล

นี่เป็นตัวอย่างที่สมบูรณ์แบบในชีวิตประจำวันว่าการย้ายลอจิกไปยังไฟล์โมเดลเป็นความคิดที่ดี - และแน่นอนว่ามันทำให้ฐานรหัสที่สะอาดยิ่งขึ้น!

ข้อผิดพลาดทั่วไป # 4: การเพิ่มความซับซ้อนมากเกินไปให้กับหลักจรรยาบรรณแทนที่จะกลับมาบ่อยครั้งและเร็ว

นี่เป็นข้อถกเถียงที่เกิดขึ้นอยู่เสมอ แต่การกลับมาบ่อยครั้งและการกลับมาก่อนเวลาทำให้โค้ดดูสะอาดขึ้นมาก สิ่งนี้ใช้กับวิธีการแบบจำลองมากกว่าสิ่งอื่นใด

แต่ฉันหมายถึงอะไรกันแน่? เรามาดูวิธีการที่เราเพิ่มไว้ในบทช่วยสอน CakePHP ด้านบน:

public function addPost($data = array(), $emailAdmin = true) { $this->create(); $this->save($data); // update any other tables // send the email to the admin user if ($emailAdmin) { } // if all is successful return true; }

หากต้องการกลับบ่อยและกลับก่อนเวลาหมายความว่าเมื่อเราดำเนินการตามฟังก์ชันของเราเราตรวจสอบเพื่อให้แน่ใจว่าทุกอย่างเรียบร้อยเป็นประจำ หากไม่เป็นเช่นนั้นเราจะส่งคืนเท็จหรือส่งคืนข้อผิดพลาด CakePHP

อาจจะง่ายที่สุดที่จะแสดงสิ่งนี้พร้อมกับตัวอย่าง ฟังก์ชันข้างต้นสามารถเขียนได้สองวิธี:

public function addPost($data = array(), $emailAdmin = true) { if ($data) { $this->create(); $result = $this->save($data); if ($result) { // update any other tables // send the email to the admin user if ($emailAdmin) { // send the admin email } } else { // problem saving the data return false; } // if all is successful return true; } else { // no data submitted return false; } }

ดูว่าโค้ดไม่สามารถอ่านได้อย่างรวดเร็วได้อย่างไร? มี if s และ else s อยู่ทั่วทุกที่และฟังก์ชันจะกลายเป็นการเยื้องขนาดใหญ่ครั้งเดียวอย่างรวดเร็ว อย่าเข้าใจฉันผิดฉันชอบการเยื้องที่สะอาด แต่ดูว่าฟังก์ชั่นมีลักษณะอย่างไรถ้ามันเขียนด้วยการส่งคืนบ่อยๆกลับหลักการก่อน

public function addPost($data = array(), $emailAdmin = true) { if (!$data) { // no data submitted return false; } $this->create(); $result = $this->save($data); if (!$result) { // problem saving the data return false; } // update any other tables // send the email to the admin user if ($emailAdmin) { // send the admin email } // if all is successful return true; }

ในตัวอย่างเล็ก ๆ นี้คุณจะเห็นโค้ดมีการเยื้องเพียงครั้งเดียวและอ่านได้ง่ายกว่ามาก ตรรกะมีเหตุผลมากกว่านั้นให้ตรรกะทำงานทีละบรรทัดและหากมีปัญหาระหว่างทางให้ส่งคืนข้อผิดพลาดและอย่าดำเนินการต่อในบรรทัดถัดไป

สิ่งนี้ช่วยให้โปรแกรมเมอร์ CakePHP สามารถเขียนแบบเดียวกับที่เราอ่าน - อ่านโค้ดจากซ้ายไปขวาบนลงล่างแทนที่จะอยู่ในบล็อกต่างๆซึ่งอาจทำให้สับสนได้อย่างรวดเร็ว!

ข้อผิดพลาดทั่วไป # 5: ไม่ใช้หลักการแห้ง

DRY ย่อมาจาก Don’t Repeat Yourself และเป็นปรัชญาที่ควรปฏิบัติตามเมื่อเขียนโค้ดใน CakePHP ด้วยรหัสเชิงวัตถุไม่มีข้อแก้ตัวสำหรับการทำซ้ำบล็อกรหัสเดียวกันสองครั้ง!

ต่อไปนี้คือเคล็ดลับบางประการของ CakePHP เพื่อให้แน่ใจว่าคุณจะไม่ทำซ้ำ:

  • ดังที่ได้กล่าวมาแล้วตั้งเป้าหมายที่จะใส่ตรรกะในไฟล์โมเดลเพื่อให้คุณสามารถแบ่งปันตรรกะได้

  • ในไฟล์มุมมองของคุณหากคุณกำลังดูมุมมองซ้ำให้สร้างรหัสมุมมองเป็นองค์ประกอบหรือแม้แต่ตัวช่วยที่กำหนดเอง

    ทำงานกับวันที่ในจาวาสคริปต์
  • ตั้งค่าการกำหนดค่าบางอย่าง - app/Config/bootstrap.php ไฟล์เป็นสถานที่ที่ยอดเยี่ยมสำหรับสิ่งนี้ วิธีนี้ช่วยให้แน่ใจว่าคุณไม่ได้เขียนโค้ดยาก ๆ เช่นชื่อแอปพลิเคชันและที่อยู่อีเมลหลัก สิ่งสุดท้ายที่คุณต้องทำคือดูไฟล์หลายร้อยไฟล์เพียงเพราะลูกค้าขอให้อัปเดตที่อยู่อีเมลในแอปพลิเคชัน

  • ถามตัวเองเสมอว่า“ ถ้าฉันเขียนโค้ดซ้ำจะมีวิธีที่ดีกว่านี้ไหมในการเขียนโค้ดนี้และฉันวางรหัสนี้ถูกที่หรือไม่” มีโอกาสที่ถ้าคุณต้องทำรหัสซ้ำก็สามารถเขียนได้ดีกว่า

ข้อผิดพลาดทั่วไป # 6: ไม่แสดงความคิดเห็นเกี่ยวกับจรรยาบรรณ

ประเด็นสุดท้ายที่ฉันจะทำคือเกี่ยวกับความคิดเห็น ประการแรกการบล็อกเอกสาร doc block คือเมื่อคุณบันทึกวิธีการหรือการดำเนินการ ใช้เวลาเพียงหนึ่งนาทีในการบันทึกเล็กน้อยเกี่ยวกับสิ่งที่ฟังก์ชันกำลังทำอยู่ แต่มันสร้างความแตกต่างในแง่ของความสามารถในการอ่านโค้ด

CakePHP Doc Blocks ต้องชิดขอบซ้ายของหน้า ดังนั้นตัวอย่างง่ายๆโดยใช้รหัสจากด้านบน

/** * Adds & saves a post as well as emails the admin to let them know the post has been added. * Also performs some saving to another table * * @param array $data The post data * @param bool $emailAdmin If set to true, will email the website admin * @return bool Returns true if successful */ public function addPost($data = array(), $emailAdmin = true) {

ดังที่คุณจะเห็นการเขียนบล็อกเอกสารใช้เวลาไม่นาน แต่สร้างความแตกต่างอย่างมากในแง่ของอายุการใช้งานของโค้ด ท้ายที่สุดก็หมายความว่าโค้ดสามารถอยู่ได้ในอดีตที่คุณเป็นนักพัฒนาซอฟต์แวร์

เช่นเดียวกันกับความคิดเห็นในบรรทัด อย่ากลัวที่จะอธิบายว่าโค้ดของคุณใช้ทำอะไรและทำไม! ช่วยให้เข้าใจโค้ดของคุณได้ง่ายขึ้นในระยะยาวโดยเฉพาะอย่างยิ่งหากนักพัฒนารายอื่นกำลังดูโค้ดอยู่!

สรุป

CakePHP เป็นเฟรมเวิร์กที่ครอบคลุมและมีคุณสมบัติครบถ้วน เนื่องจากเป็นไปตามแบบแผนเกี่ยวกับการกำหนดค่า CakePHP จึงเข้มงวดกว่าเฟรมเวิร์กที่ใช้ PHP อื่น ๆ ในแง่ที่ผู้ใช้ 'บังคับ' ให้ทำตามวิธีการบางอย่างในการวางโค้ด สิ่งนี้อาจเป็นที่ถกเถียงกัน แต่จากประสบการณ์ของฉันมันนำไปสู่ฐานรหัสที่มีความสอดคล้องอ่านได้และเข้าใจได้มากกว่า - แทนที่จะปล่อยให้นักพัฒนา 'เลือก' ว่าควรเขียนโค้ดอย่างไรทีมพัฒนาจะเขียนโค้ดที่สอดคล้องกันโดยทำตามอนุสัญญาของ Cake .

ด้วยการทำตามบทช่วยสอน CakePHP นี้และตรวจสอบให้แน่ใจว่าโค้ดของคุณเขียนได้ดีแอปพลิเคชั่นสามารถยืนหยัดอยู่ได้ ควรเขียนโค้ดสำหรับวันพรุ่งนี้เสมอ - เพื่อที่ว่าหากนักพัฒนารายอื่นกำลังมองหาบล็อกโค้ดเฉพาะในอีกหลายปีต่อมาเขาจะเข้าใจโค้ดและยึดตามมาตรฐานที่คาดไว้ CakePHP ก็ไม่ต่างกันและหวังว่าคู่มือนี้จะช่วยแก้ไขนิสัยที่ไม่ดีบางอย่างได้

วิศวกรแบ็คเอนด์อาวุโสทีม Rogue One

อื่น ๆ

วิศวกรแบ็คเอนด์อาวุโสทีม Rogue One
ทั้งหมดเกี่ยวกับกระบวนการ - การวิเคราะห์ผลงานกรณีศึกษา

ทั้งหมดเกี่ยวกับกระบวนการ - การวิเคราะห์ผลงานกรณีศึกษา

กระบวนการออกแบบ

โพสต์ยอดนิยม
Nvidia Shield - สิ่งที่แตกต่างบนคอนโซลเกม Android
Nvidia Shield - สิ่งที่แตกต่างบนคอนโซลเกม Android
แผ่นโกงการจัดการโครงการ
แผ่นโกงการจัดการโครงการ
เริ่มต้นใช้งาน Microservices: บทช่วยสอน Dropwizard
เริ่มต้นใช้งาน Microservices: บทช่วยสอน Dropwizard
การแยกการเรียกเก็บเงิน: เรื่องของการเพิ่มประสิทธิภาพ API ภายใน GraphQL
การแยกการเรียกเก็บเงิน: เรื่องของการเพิ่มประสิทธิภาพ API ภายใน GraphQL
กรณีศึกษา: การใช้ ApeeScape เพื่อม้วนปลาใหญ่
กรณีศึกษา: การใช้ ApeeScape เพื่อม้วนปลาใหญ่
 
การประมาณต้นทุนซอฟต์แวร์ในการจัดการโครงการแบบ Agile
การประมาณต้นทุนซอฟต์แวร์ในการจัดการโครงการแบบ Agile
แชทล่ม - เมื่อ Chatbot ล้มเหลว
แชทล่ม - เมื่อ Chatbot ล้มเหลว
ที่ปรึกษาการระดมทุนกับนายหน้า - ตัวแทนจำหน่าย
ที่ปรึกษาการระดมทุนกับนายหน้า - ตัวแทนจำหน่าย
ทำให้ Web Front-end เชื่อถือได้ด้วย Elm
ทำให้ Web Front-end เชื่อถือได้ด้วย Elm
คู่มือสำหรับนักลงทุนเกี่ยวกับน้ำมันปาล์ม
คู่มือสำหรับนักลงทุนเกี่ยวกับน้ำมันปาล์ม
โพสต์ยอดนิยม
  • เครื่องมือสร้างภาพข้อมูลขนาดใหญ่
  • วิธีหาความยืดหยุ่นของราคาของอุปสงค์
  • วิธีใช้คำสั่งบอทที่ไม่ลงรอยกัน
  • บอทโทรเลขคืออะไร
  • ความสำคัญของการรวมองค์ประกอบของการออกแบบในทัศนศิลป์คืออะไร
หมวดหมู่
  • การจัดการวิศวกรรม
  • Kpi และ Analytics
  • เทคโนโลยี
  • ว่องไว
  • © 2022 | สงวนลิขสิทธิ์

    portaldacalheta.pt