คุณควรเสียสละการอ่านรหัสด้วยรหัสที่มีประสิทธิภาพหรือไม่
เช่น 3 บรรทัดของรหัสเป็น 1 บรรทัด
ฉันอ่านในCode Craftโดย Pete Goodliffe ว่าการอ่านเป็นกุญแจสำคัญ
ความคิดของคุณ?
คุณควรเสียสละการอ่านรหัสด้วยรหัสที่มีประสิทธิภาพหรือไม่
เช่น 3 บรรทัดของรหัสเป็น 1 บรรทัด
ฉันอ่านในCode Craftโดย Pete Goodliffe ว่าการอ่านเป็นกุญแจสำคัญ
ความคิดของคุณ?
คำตอบ:
"เส้นที่น้อยลง" นั้นไม่เหมือนกับสิ่งที่ "มีประสิทธิภาพมากขึ้น" ฉันถือว่าคุณหมายถึง "ควรทำให้โปรแกรมสั้นลงโดยมีค่าใช้จ่ายในการอ่าน"
โปรแกรมจะต้องถูกเขียนขึ้นเพื่อให้ผู้คนอ่านและมีเพียงเครื่องที่จะทำงาน
-Abelson & Sussman โครงสร้างและการตีความโปรแกรมคอมพิวเตอร์
โดยทั่วไปฉันคิดว่ามันสำคัญกว่าที่โปรแกรมจะเข้าใจได้ง่ายกว่าเพื่อให้สั้น ฉันควรทราบว่าการทำให้โปรแกรมสั้นลงมักทำให้อ่านได้ง่ายขึ้น (มีเกณฑ์ที่ชัดเจนที่คุณจะได้รับเมื่อโค้ดของคุณเริ่มดูเหมือนเส้นเสียงรบกวน แต่จนถึงจุดนั้น
มีข้อยกเว้นเฉพาะ (เช่นสคริปต์เชลล์ส่วนบุคคลของคุณหรือรหัสการดึงข้อมูลหนึ่ง) ที่ไม่มีใครจำเป็นต้องบำรุงรักษาและมีเพียงคุณเท่านั้นที่จะต้องอ่าน ในสถานการณ์นั้นคุณอาจเสียสละความสามารถในการอ่านเพื่อความรวดเร็วตราบเท่าที่คุณยังสามารถเข้าใจได้
บางครั้งใช่.
การอ่านเป็นสิ่งที่ดีที่จะมุ่งมั่น รหัสส่วนใหญ่ที่เขียนขึ้นสำหรับแอพพลิเคชั่นธุรกิจทั่วไปจะมีประสิทธิภาพเพียงพอและการมุ่งเน้นไปที่ความสามารถในการอ่านเป็นสิ่งสำคัญ ในพื้นที่ที่ต้องการประสิทธิภาพมากขึ้น (เช่นการเขียนโปรแกรมวิดีโอเกมหรือการคำนวณอย่างหนัก) มันอาจเป็นสิ่งสำคัญที่จะยกเลิกการอ่านเพื่อใช้คุณสมบัติภาษาเฉพาะที่อ่านไม่ออกอย่างน่ากลัว
สำหรับตัวอย่างหลังดูที่บทความFast Inverse Square Rootบน Wikipedia
โดยทั่วไปฉันคิดว่ามันจะดีกว่าที่จะทำให้บางสิ่งบางอย่างที่สามารถอ่านได้ก่อนและกังวลเกี่ยวกับประสิทธิภาพการทำงานหลังจากให้ข้อควรระวังสามัญสำนึกเช่นไม่เลือกอัลกอริทึม O (n ^ 2) มากกว่า O (n) การอ่านอย่างเสียสละเพื่อประโยชน์ของความกะทัดรัดเพียงอย่างเดียวคือในใจของฉันเข้าใจผิด
ครั้งเดียวที่ฉันเสียสละความสามารถในการอ่านคือเมื่อรหัสแสดงว่าเป็นคอขวดของประสิทธิภาพและการเขียนใหม่จะแก้ไขปัญหานั้น ในกรณีนั้นความตั้งใจของรหัสควรจัดทำเป็นเอกสารไว้อย่างดีเพื่อให้มีข้อผิดพลาดสามารถติดตามได้ง่ายขึ้น
ไม่ได้บอกว่าการเขียนจะต้องอ่านไม่ได้แน่นอน
ฉันยกมาก่อนและฉันจะพูดอีกครั้ง
ทำให้ถูกต้อง
ทำให้ชัดเจน
ทำให้รัดกุม
ทำให้เร็วขึ้นเพื่อให้.
คุณควรเสียสละความสามารถในการอ่านโค้ดด้วยประสิทธิภาพของรหัสหรือไม่
ในแง่ของรหัสมันเป็นเรื่องดีเสมอที่จะทำเอกสารด้วยตนเอง แต่บางครั้งก็ไม่สามารถเกิดขึ้นได้ บางครั้งคุณจำเป็นต้องปรับให้เหมาะสมและบางครั้งรหัสนั้นไม่สามารถอ่านได้ในตัวเองมาก
นี่คือสิ่งที่แสดงความคิดเห็นถูกคิดค้นขึ้นสำหรับ ใช้มัน. แม้แต่การชุมนุมก็มีความคิดเห็น หากคุณเขียนรหัสจำนวนมากและไม่มีความเห็นต่อเนื่องฉันก็เป็นห่วง ความคิดเห็นไม่ส่งผลกระทบต่อประสิทธิภาพการทำงานของเวลา แต่มีหมายเหตุเล็กน้อยเกี่ยวกับสิ่งที่เกิดขึ้นช่วยเสมอ
มีอยู่ในใจของฉันไม่มีข้อแก้ตัวที่จะไม่แสดงความคิดเห็นขั้นพื้นฐานบางอย่าง เห็นได้ชัดว่าif ( x == 0 ) /* check if x is 0 */
ไร้ประโยชน์โดยสิ้นเชิง คุณไม่ควรเพิ่มเสียงที่ไม่จำเป็นให้กับรหัส แต่สิ่งนี้:
; this is a fast implementation of gcd
; in C, call as int gcd(int a, int b)
; args go in rdi, rsi, rcx, r8, r9
gcd:
push rdp
; ...
มีประโยชน์มากเลยทีเดียว
คุณควรเสียสละความสามารถในการอ่านโค้ดด้วยประสิทธิภาพของรหัสหรือไม่
หากประสิทธิภาพคือเป้าหมายปัจจุบันของคุณ (เช่นในขั้นตอนการเพิ่มประสิทธิภาพ) และคุณรู้ - คุณมีตัวชี้วัดใช่ไหม - บรรทัดนั้นของรหัสคือคอขวดปัจจุบันแล้วใช่
มิฉะนั้นไม่: การอ่านได้จะช่วยให้คุณ (หรืออีกคนหนึ่ง) สามารถเปลี่ยนรหัสนี้ในภายหลังเพื่อให้มีประสิทธิภาพมากขึ้นเนื่องจากง่ายต่อการเข้าใจ
ไม่มีใครชนะรหัสกอล์ฟ
เช่น 3 บรรทัดของรหัสเป็น 1 บรรทัด
ความคิดที่แย่มาก
ค่าใช้จ่ายในการเล่นรหัสกอล์ฟ - สูงมาก
ค่าใช้จ่ายในการบำรุงรักษาโปรแกรมที่อ่านไม่ได้ - ทางดาราศาสตร์
ค่าของโค้ดที่ย่อเล็กสุดนี้ - ศูนย์ มันยังใช้งานได้ แต่ไม่ทำงาน "ดีกว่า"
เลือกอย่างมีประสิทธิภาพ
ค่าใช้จ่ายในการเลือกอัลกอริทึมที่ถูกต้องและโครงสร้างข้อมูล - ปานกลาง
ค่าใช้จ่ายในการรักษาอัลกอริธึมที่เหมาะสมและโครงสร้างข้อมูล - ต่ำ
ค่าของอัลกอริทึมที่เหมาะสมและโครงสร้างข้อมูล - สูง การใช้ทรัพยากรอยู่ในระดับต่ำ
โง่ ("การเพิ่มประสิทธิภาพขนาดเล็ก") มีประสิทธิภาพ
ค่าใช้จ่ายในการเล่นโดยใช้การปรับขนาดเล็ก - สูง
ค่าใช้จ่ายในการบำรุงรักษาโค้ดที่ไม่สามารถอ่านได้และปรับให้เหมาะสมกับไมโคร - สูงมาก
มูลค่าของการเพิ่มประสิทธิภาพแบบไมโคร - แตกต่างกันไป เมื่อมีค่าที่ไม่เป็นศูนย์ที่นี่ค่าใช้จ่ายยังคงมีค่าเกิน
ขึ้นอยู่กับว่าเรากำลังพูดถึงประสิทธิภาพในเรื่องของความเร็วในการเรียกใช้งานโค้ดหรือประสิทธิภาพในการที่นักพัฒนาสามารถเขียนโค้ดได้อย่างรวดเร็ว หากคุณกำลังเสียสละความสามารถในการอ่านรหัสเพื่อให้สามารถพิมพ์รหัสได้อย่างรวดเร็วมากคุณอาจพบว่าตัวเองใช้เวลาในการตรวจแก้จุดบกพร่อง
อย่างไรก็ตามหากเรากำลังพูดถึงการเสียสละความสามารถในการอ่านโค้ดในแง่ของความเร็วในการประมวลผลของรหัสมันน่าจะเป็นการแลกเปลี่ยนที่ยอมรับได้ตราบใดที่รหัสนั้นต้อง preform อย่างมีประสิทธิภาพ การเขียนบางสิ่งที่ทำงานเร็วที่สุดเท่าที่จะเป็นไปได้เพียงเพราะคุณไม่สามารถมีเหตุผลได้เกือบเท่าเพราะมันเป็นสิ่งที่เหมือนกับสแควร์รูทแบบผกผันแบบเร็วที่ประสิทธิภาพเป็นกุญแจสำคัญ เคล็ดลับจะอยู่ระหว่างการปรับสมดุลโค้ดและตรวจสอบให้แน่ใจว่าถึงแม้ว่าแหล่งที่มาอาจอ่านยากความคิดเห็นที่อธิบายสิ่งที่อธิบายถึงสิ่งที่เกิดขึ้น
เทคนิคจำนวนมากซึ่งควรจะให้รหัสได้เร็วขึ้น แต่มีแนวโน้มที่จะทำให้โค้ด readble น้อยไม่จำเป็นอีกต่อไปเพราะคอมไพเลอร์อย่างใดอย่างหนึ่งได้ฉลาดมาก (ฉลาดมากยิ่งกว่านักพัฒนาส่วนใหญ่)หรือเครื่องได้อย่างรวดเร็วไร้สาระ
ฉันไม่ยอมรับอาร์กิวเมนต์ "อ่านง่ายกว่าประสิทธิภาพ" ฉันจะให้คำตอบกับสปินที่ต่างออกไป
คุณรู้ไหมว่าอะไรทำให้ฉันป่วย เมื่อฉันคลิกสองครั้งที่คอมพิวเตอร์ของฉันและฉันต้องรอให้มันเติม ถ้ามันใช้เวลานานกว่า 5 วินาทีฉันก็จะผิดหวังจริง ๆ สิ่งที่โง่คือและไม่เพียง แต่โทษ Microsoft สำหรับเรื่องนี้คือในบางกรณีเหตุผลที่ใช้เวลานานมากคือการตัดสินใจจะต้องทำในสิ่งที่ไอคอนที่จะแสดง! ถูกตัอง. ดังนั้นที่นี่ฉันนั่งอยู่เพียง แต่สนใจที่จะไปที่ไดรฟ์ C: และฉันต้องรอให้คนขับเข้าถึงซีดีรอมของฉันและอ่านไอคอนจากที่นั่น (สมมติว่ามีซีดีอยู่ในไดรฟ์)
ตกลง. ดังนั้นเพียงแค่จินตนาการชั้นที่สองระหว่างฉันคลิกสองครั้งที่คอมพิวเตอร์ของฉันและจริง ๆ แล้วมันพูดผ่านไดรเวอร์ไปยังซีดีรอม ทีนี้ลองนึกภาพว่าทุกชั้น ... เร็วขึ้น ...
คุณจะเห็นว่าเบื้องหลังทั้งหมดนี้เป็นโปรแกรมเมอร์ที่มีความสุข 1,000 คนเพราะรหัสของพวกเขาคือ "อ่านง่ายขึ้น" เยี่ยมมาก ฉันดีใจกับคุณด้วย. แต่จากมุมมองของผู้ใช้มันแค่แย่ (ศัพท์เทคนิค) ดังนั้นคุณนอนหลับในเวลากลางคืนโดยบอกตัวเองว่าคุณทำสิ่งที่ถูกต้องด้วยการทำให้แน่ใจว่ารหัสนั้นอ่านได้ง่ายขึ้นและช้าลง แม้ช้ากว่าที่เป็นไปได้เล็กน้อย และนักพัฒนากว่า 1,000 คนทำเช่นนี้และท้ายที่สุดเราก็รอพีซีของเราเพราะคุณ ในความคิดของฉันคุณจะไม่คู่ควร ฉันไม่ได้บอกว่าบรรทัดแรกของคุณจะต้องดีที่สุด
นี่คือแนวทางของฉัน: ก่อนอื่นทำให้มันทำงานแล้วทำให้เร็วขึ้น มุ่งมั่นที่จะเขียนโค้ดที่มีประสิทธิภาพเสมอและหากคุณต้องเสียสละความสามารถในการอ่านให้เสริมด้วยความคิดเห็น ฉันจะไม่เสียสละประสิทธิภาพเพื่อให้โปรแกรมเมอร์บางคนสามารถรักษามันได้ อย่างไรก็ตามฉันจะอธิบายรหัสของฉัน แต่ถ้านั่นยังไม่เพียงพอฉันขอโทษคุณแค่ไร้ความสามารถที่จะทำงานที่นี่ เพราะที่นี่เราเขียนโค้ดที่รวดเร็วและอ่านได้และแม้ว่าจะมีความสมดุล แต่โค้ดที่อ่านได้สามารถอธิบายได้ในขณะที่ความไร้ประสิทธิภาพไม่สามารถยอมรับได้
คำถามนี้มักจะเข้ามาในใจของฉันเมื่อมีการพูดคุยการสัมภาษณ์ในสำนักงาน เมื่อหลายปีก่อนเมื่อเรียนจบฉันถูกถามคำถามว่า "คุณคิดว่ารหัสเป็นเอกสารด้วยตนเองหรือไม่" ตอนนี้ฉันต้องตอบคำถามนี้ในฐานะโปรแกรมเมอร์และเท่าที่ผู้สัมภาษณ์กังวลก็เป็นคำถามดำและขาวดังนั้นจึงไม่มีจุดกลาง กระบวนการควรจะอยู่ได้นานกว่า indivdual เนื่องจากผู้คนจะมีชีวิตชีวามากกว่าและไปและคุณต้องการเริ่มต้นใหม่ให้เร็วที่สุดเท่าที่จะเป็นไปได้และยิ่งรหัสอ่านง่ายขึ้นเท่าไหร่ก็จะยิ่งเข้าใจได้เร็วขึ้นว่ากำลังเกิดอะไรขึ้น
ฉันอ่านหนังสือมาพักหนึ่งแล้วว่ามันค่อนข้างดีเรียกว่า Domain Driven Development: การออกแบบที่ขับเคลื่อนด้วยโดเมน: การแก้ปัญหาความซับซ้อนในใจกลางของซอฟท์แวร์ยอมรับว่ามันเป็นการอ่านที่ค่อนข้างแห้งในตอนเริ่มต้น สิ่งนี้แสดงให้เห็นถึงการอนุมัติที่ดีที่นำไปสู่ระบบที่จัดทำเอกสารด้วยตนเองได้ดี ภาษาเป็นสื่อกลางในการสื่อสารวิธีแก้ปัญหาของคุณดังนั้นวิธีแก้ปัญหาที่ชัดเจนก็จะแสดงให้เห็นได้ง่ายขึ้นหากการแสดงเป็นปัจจัยสำคัญ นั่นเป็นความเชื่อของฉันและดูเหมือนว่าจะทำงานได้ดีสำหรับฉัน
ROI จะช่วยให้โค้ดทำงานได้เร็วขึ้นโดยที่ค่าใช้จ่ายในการอ่านจะคุ้มค่า คอมพิวเตอร์สมัยใหม่ทำงานเร็วจนฉันสงสัยว่าจะมีสถานการณ์ที่คุณต้องการสิ่งนี้ หากคอมพิวเตอร์ใช้งานรหัสจำเป็นต้องดูแลรักษารหัสนั้น
ด้วยเหตุนี้ฉันพบว่าการอ่านมีความสำคัญมาก แน่นอนตามที่ระบุไว้หลายครั้งเพียงเพราะรหัสไม่สามารถอ่านได้หมายความว่ามันช้าลง
ตัวอย่างที่ดีคือชื่อตัวแปร: $a
คืออะไร$a
?? นี่เป็นบริบทที่คุณไม่สามารถตอบได้ แต่คุณเคยพบปัญหานี้ในรหัสจริงหรือไม่? ทีนี้สมมติมีคนเขียน$file_handle
ตอนนี้คืออะไร ชัดเจนแม้จะอยู่นอกบริบท ความยาวของชื่อตัวแปรสร้างความแตกต่างเล็กน้อยกับคอมพิวเตอร์
ฉันคิดว่ามีสามัญสำนึกที่จะมีที่นี่
แอปพลิเคชั่นบางอย่างอาจรับประกันการลัดวงจรแบบบิตกะซึ่งไม่ใช่ทั้งหมดที่จะเข้าใจ แต่ฉันคิดว่าในบางจุดมีผลตอบแทนลดลงและการค้นหาสถานการณ์นั้นหายาก *
* สิ่งนี้ขึ้นอยู่กับอุตสาหกรรมและสิ่งอื่น ๆ ฉันกำลังดูสิ่งนี้จากมุมมองของนักพัฒนาซอฟต์แวร์ธุรกิจ (Business Information Systems)
เมื่อต้องการดูสิ่งนี้จากมุมมองอื่น (แต่ไม่ใช่เพื่อเดินเล่น) ฉันทำงานใน บริษัท ที่ทำ SAAS เมื่อไซต์หยุดทำงานเราต้องแก้ไขอย่างรวดเร็วจริงๆ - โดยปกติคนอื่นจะแก้ไขรหัสของผู้พัฒนารายอื่น
ฉันต้องการมากค่อนข้างมีคนทำอะไรบางอย่างได้ผลมาก แต่สามารถอ่านได้มากกว่าที่จะทำให้มันแฟนซีและ "เร็ว" เว็บเซิร์ฟเวอร์ของเราทันสมัยและคำขอไม่จำเป็นต้องถูกส่งเป็นล้านในวินาที เราไม่มีปัญหาเรื่องโหลด
ดังนั้นในทางปฏิบัติฉันคิดว่าคุณมีแนวโน้มที่จะทำร้ายตัวเองหรือผู้อื่น ...
ส่วนใหญ่ทุกกรณีคำตอบคือ "เชื่อถือคอมไพเลอร์ของคุณเพื่อทำงาน" และเขียนโค้ดที่อ่านได้ นี่หมายความว่ารหัสมีโครงสร้างเชิงตรรกะ (เช่นไม่มีปาเก็ตตี้) และการจัดทำเอกสารด้วยตนเอง (เช่นชื่อของตัวแปรฟังก์ชั่น ฯลฯ ) ที่ชัดเจนเพียงพอ รหัสเสริมที่ไม่ได้จัดทำเป็นเอกสารพร้อมความคิดเห็นที่มีความหมาย อย่าแสดงความคิดเห็นเพื่อประโยชน์ในการแสดงความคิดเห็นเช่น
x++; // Add one to x
ค่อนข้างแสดงความคิดเห็นสำหรับคุณผู้อ่านใน 6 เดือนหรือ 12 เดือนหรือบางเวลานานพอสมควร ใช้มาตรฐานการเข้ารหัสและปฏิบัติตาม
รหัสที่สะอาดคือรหัสที่รวดเร็ว เขียนชัดเจนและง่ายต่อการบำรุงรักษารหัสมีแนวโน้มที่จะเร็วขึ้นเพราะมันเป็นตัวบ่งชี้ว่าโปรแกรมเมอร์เข้าใจงานในมือและ refactored รหัสลงไปเพื่อวัตถุประสงค์หลัก
นอกจากนี้คอมไพเลอร์สมัยใหม่ยังเพิ่มประสิทธิภาพคำแนะนำอย่างมีประสิทธิภาพ จำนวนบรรทัดของโค้ดที่คุณพิมพ์เพื่อทำบางสิ่งและสิ่งที่คอมไพเลอร์สร้างในแง่ของคำแนะนำไม่จำเป็นต้องเกี่ยวข้องกัน อ่านคอมไพเลอร์เพื่อทำความเข้าใจว่าทำไมถึงเป็นเช่นนั้น
เมื่อฉันทำงานกับสิ่งที่มีประสิทธิภาพเช่นกราฟิกฉันจะต้องเสียสละความสามารถในการอ่าน / การบำรุงรักษาเป็นบางครั้งเมื่อฉันทำสิ่งต่าง ๆ เช่นการประมวลผลภาพเมื่อฉันทำงานกับอัลกอริทึมซ้อนกันที่ลึกที่สุดซึ่งการปรับให้เหมาะสมขนาดเล็ก และหลังจากนั้นฉันก็ทำหลังจากทำโปรไฟล์เพื่อให้แน่ใจว่าการเปลี่ยนแปลงจะเร่งดำเนินการอย่างแท้จริง ฉันไม่สามารถบอกคุณได้ว่ามีกี่ครั้งที่ฉันลองใช้การเขียนโค้ด 'การปรับให้เหมาะสม' เพียงเพื่อจะพบว่าจริง ๆ แล้วมันทำให้แอปช้าลงเนื่องจากวิธีที่คอมไพเลอร์ปรับรหัสมือให้เหมาะสม
ความสามารถในการอ่านเป็นข้อแก้ตัวสำหรับโปรแกรมเมอร์ที่ไร้ความสามารถและขี้เกียจ (อันที่จริงแล้วใช้สำหรับ "ความเรียบง่าย" เมื่อใช้เป็นอาร์กิวเมนต์เพื่อปกป้องอัลกอริทึม / การออกแบบเส็งเคร็ง)!
สำหรับทุกปัญหาที่กำหนดคุณควรพยายามหาทางออกที่ดีที่สุด! ข้อเท็จจริงที่ว่าคอมพิวเตอร์ทุกวันนี้เร็วไม่ได้เป็นข้ออ้างที่จะทำให้เสียรอบ CPU ข้อ จำกัด เพียงอย่างเดียวคือ "เวลาในการแสดง" โปรดทราบว่า "ทางออกที่ดีที่สุด" ที่นี่หมายถึงสิ่งที่คุณสามารถทำได้ (เราไม่สามารถหาทางออกที่ดีที่สุดหรือมีทักษะ / ความรู้ในการใช้งาน)
ตามที่คนอื่นพูดถึงหากมี "แง่มุมที่เข้าใจยาก" ของโซลูชันนั่นคือความคิดเห็น คำสั่งซื้อ "ถูกต้องอ่านได้เร็ว" (หรืออะไรทำนองนั้น) ที่คนอื่นพูดถึงเป็นเรื่องเสียเวลา
ฉันมีเวลายากมากที่จะเชื่อว่ามีโปรแกรมเมอร์อยู่ข้างนอกซึ่งเมื่อพบกับปัญหาที่พวกเขาคิดในบรรทัด "... ต้องทำแบบนี้ แต่ฉันจะทำให้วิธีที่มีประสิทธิภาพน้อยลง แต่อ่านได้มากขึ้น / บำรุงรักษาและอึอื่น ๆ เช่น ... " ความผิดพลาดของสิ่งนี้คือผู้พัฒนารายต่อไป (เห็นความไร้ประสิทธิภาพ) ส่วนใหญ่จะแก้ไขรหัสและสิ่งต่อไปจะทำเช่นเดียวกันและต่อไป ... ผลสุดท้ายคือหลังจากรุ่นไม่กี่รุ่นรหัสจะกลายเป็นสิ่งที่เป็นต้นฉบับ นักพัฒนาควรมีการเขียนในที่ 1 ข้อแก้ตัวสำหรับนักพัฒนาดั้งเดิมเท่านั้นคือ เขา / เธอไม่ได้คิดถึง (พอใช้ได้) และ (ดังที่กล่าวไว้ก่อนหน้านี้) ข้อ จำกัด ด้านเวลาและทรัพยากร
ถ้าการลดความสามารถในการอ่านช่วยให้โค้ดทำงานได้อย่างมีประสิทธิภาพ / เพิ่มประสิทธิภาพ (เช่นในswfobjectและ js อื่น ๆ ) มันเป็นเหตุผลที่ทำให้การเขียนโค้ดที่มีรูปแบบที่ดีและอ่านได้ชัดเจนและแปลงให้เป็น