"สวัสดี Amigo วันนี้ฉันจะบอกคุณเกี่ยวกับรูปแบบรหัสและความสำคัญของรูปแบบรหัส"
"ฉันจะเริ่มต้นด้วยสิ่งที่สำคัญที่สุด โค้ด Java ควรอ่านง่าย แนวทางทั่วไปของโค้ดคือ: โค้ดเขียนครั้งเดียวแต่อ่านร้อยครั้ง"
"สมมติว่าคุณและโปรแกรมเมอร์อีก 10 คนกำลังเขียนแอปพลิเคชัน คุณทำงานในแอปพลิเคชันเป็นเวลาสามปี โดยมีการเผยแพร่ขั้นกลางทุกสามเดือน"
"มานานแล้วว่า?"
"นี่คือ Java เจ้าตั๊กแตนตัวน้อยของฉัน!" แล้วระบบขององค์กรที่ทำงานบนเซิร์ฟเวอร์โหลและเขียนโดยคน 100 คนในระยะเวลากว่า 6 ปีล่ะ? บางครั้งก็เกิดขึ้นเช่นกัน”
"โว้ว."
"อย่างไรก็ตาม กฎหลัก ข้อกำหนดหลักสำหรับโค้ดคือต้องง่ายสำหรับนักพัฒนารายอื่นในการอ่าน"
"ในภาษาการเขียนโปรแกรมอื่นๆ ผู้คนมักทำงานเป็นทีมเล็กๆ ในงานเล็กๆ ดังนั้นพวกเขาอาจมีกฎหลักอีกข้อหนึ่ง เช่น 'ได้ผลหรือไม่ ยอดเยี่ยม'"
"ในช่วงเวลา 2-3 ปี สมาชิกในทีมของคุณทุกคนจะทำการเปลี่ยนแปลงโค้ดที่คุณเขียนขึ้นหลายครั้ง และในแต่ละครั้งพวกเขาจะต้องเข้าใจว่าโค้ดทำงานอย่างไร"
"และโค้ดที่ไม่สามารถเข้าใจได้ซึ่งทำงานได้อย่างสมบูรณ์นั้นยากต่อการเปลี่ยนแปลง พวกเขาจะทิ้งมันและเขียนใหม่ในแบบฉบับของตัวเอง ดังนั้น เขียนโค้ดที่คนอื่นสามารถเข้าใจได้ หากคุณสามารถปรับปรุงโค้ดของคุณได้ ก็จงปรับปรุงมัน หากสามารถปรับปรุงได้ งั้นก็ต้องปรับปรุงสิ! "
"ถ้าคุณเขียนโค้ด 15 นาที แล้วใช้เวลา 2 ชั่วโมงในการปรับปรุง แสดงว่าคุณทำถูกแล้ว คุณช่วยทีมได้นานแค่ไหน"
"'2 ชั่วโมงเพื่อทำความเข้าใจโค้ดของคุณ' x '100 ครั้งที่ผู้คนจำเป็นต้องเข้าใจโค้ด' = 200 ชั่วโมง"
"ฉันดึงตัวเลขเหล่านี้ออกมาได้แต่อยากให้คุณเข้าใจปัญหาและขอบเขตของมัน รหัสของคุณถูกสร้างขึ้นเพื่อให้โปรแกรมเมอร์คนอื่นอ่าน อย่างอื่นเป็นเรื่องรอง"
"รหัสทำงานไม่ถูกต้องหรือไม่ เราจะแก้ไข ไม่ปรับให้เหมาะสม เราจะปรับให้เหมาะสม ไม่ได้รับการจัดทำเป็นเอกสาร เราจะเพิ่มความคิดเห็น"
" รหัสอ่านยากไหม? ทิ้งขยะนั้นลงถังขยะแล้วเขียนใหม่ทั้งหมดตั้งแต่เริ่มต้น! "
“ไม่คิดว่ามันจะเป็นเรื่องใหญ่ขนาดนี้”
"เหตุผลหนึ่งที่ Java เป็นภาษาโปรแกรมชั้นนำก็คือโค้ด Java ทั้งหมดเขียนขึ้นเพื่อให้โปรแกรมเมอร์คนอื่นอ่านได้"
"ตอนนี้เรามาที่คำถามที่สอง: คุณจะทำให้รหัสของคุณอ่านง่ายที่สุดได้อย่างไร "
"ทุกคนสามารถเข้าใจได้เมื่อมีคนพูดคำที่คุ้นเคยในภาษาแม่ของเขาหรือเธอ เช่นเดียวกับที่นี่ โค้ดอ่านง่ายเมื่อโปรแกรมเมอร์เดาได้ง่าย:
A) แต่ละวิธีทำอะไร
B) จุดประสงค์ของแต่ละชั้นเรียน
C) สิ่งที่ตัวแปรแต่ละตัวเก็บ
ทั้งหมดนี้ถูกสื่อสารในชื่อ: ชื่อคลาส ชื่อเมธอด และชื่อตัวแปร นอกจากนี้ยังมีสไตล์เมื่อพูดถึงการตั้งชื่อตัวแปร และมีสไตล์รหัส"
"ฉันพร้อมที่จะฟัง"
" การเขียนโปรแกรมขึ้นอยู่กับภาษาอังกฤษที่ดี! โปรแกรมที่เขียนอย่างดีอ่านเหมือนเอกสารทางเทคนิคทั่วไป "
" มาเริ่มกันที่ชื่อ "
"ชื่อเมธอดควรอธิบายโดยย่อว่าเมธอดทำอะไร จากนั้นจึงอ่านโค้ดได้เหมือนร้อยแก้วง่ายๆ"
public String downloadPhoto(String url)
{
String resultFileName = TempHelper.createTempFileName();
Downloader downloader = new SingleFileDownloader(new Url(url));
downloader.setResultFileName(resultFileName)
downloader.start();
while(downloader.isDone())
{
Thread.sleep(1000);
}
if (downloader.hasError())
return null;
return resultFileName;
}
"นี่คือวิธีอ่านโปรแกรมดังกล่าว"
บรรทัดที่ 1
"เมธอดนี้เรียกว่า 'downloadPhoto' ดูเหมือนว่าจะดาวน์โหลดไฟล์รูปภาพจากอินเทอร์เน็ต จะดาวน์โหลดไปที่ใด เรายังไม่รู้ มาจากไหน เมธอดนี้มีพารามิเตอร์ชื่อ url ซึ่งน่าจะเป็น URL สำหรับ ดาวน์โหลด"
บรรทัดที่ 3
"ตัวแปร resultFileName ถูกประกาศและกำหนดค่าโดย TempHelper.createTempFileName();"
นี่ต้องเป็นพาธในเครื่องไปยังไฟล์ที่เราจะบันทึกไฟล์ที่เราดาวน์โหลด
"ชื่อ 'TempHelper' ไม่ได้บอกอะไรเรา ส่วนต่อท้าย 'Helper' บอกว่านี่เป็นคลาสยูทิลิตี้ประเภทหนึ่งที่ไม่มีตรรกะทางธุรกิจที่สำคัญ แต่ใช้เพื่อลดความซับซ้อนของงานประจำที่เกิดขึ้นบ่อยครั้ง"
"ชื่อเมธอด 'createTempFileName' บ่งชี้ว่าเมธอดนี้สร้างและส่งคืนชื่อไฟล์ชั่วคราว (ไฟล์ temp) ไฟล์ temp เป็นไฟล์ชั่วคราวที่สร้างขึ้นชั่วขณะ จากนั้นมักจะถูกลบเมื่อปิดโปรแกรม "
บรรทัดที่ 5
"วัตถุ SingleFileDownloader ถูกสร้างขึ้นและกำหนดให้กับตัวดาวน์โหลดตัวแปร"
นี่คือวัตถุที่จะดาวน์โหลดไฟล์ของเราจากอินเทอร์เน็ต
"วัตถุ SingleFileDownloader ถูกกำหนดให้กับตัวดาวน์โหลดตัวแปร จากชื่อ เราอาจสันนิษฐานว่าโปรแกรมมีคลาสตัวดาวน์โหลดหลายประเภท คลาสหนึ่งถูกเขียนขึ้นสำหรับการดาวน์โหลดไฟล์เดี่ยว และเราอาจคาดหวังได้ว่าจะพบตัวดาวน์โหลดอื่นๆ ในโค้ดสำหรับกลุ่ม ของไฟล์ที่มีชื่อเช่น: MultiFileDownloader, FileGroupDownloader หรือ DirectoryDownloader"
บรรทัดที่ 6
"เราตั้งค่าคุณสมบัติ resultFileName ของวัตถุดาวน์โหลดให้เท่ากับค่าของตัวแปร resultFileName กล่าวอีกนัยหนึ่งคือ เราบอกตัวโหลดว่าจะบันทึกไฟล์ที่ดาวน์โหลดไว้ที่ไหน ตามที่คุณคาดไว้ ดังนั้นเราจึงคาดคะเนโค้ดโดยพื้นฐานแล้ว!"
บรรทัดที่ 7
"เราเรียกเมธอด start ว่าการดาวน์โหลดเริ่มขึ้น มีเหตุผล ฉันสงสัยว่าการดาวน์โหลดเกิดขึ้นได้อย่างไร: เป็นส่วนๆ บนเธรดแยกต่างหาก หรือทั้งหมดที่นี่ หากเราดาวน์โหลดทั้งหมดที่นี่ อาจต้องใช้เวลา ยาวนานและมีผลตามมา”
สาย 8-11
"อา ที่นี่เราเห็นลูปมาตรฐานที่เขียนโดยใครบางคนที่รอให้การดาวน์โหลดเสร็จสิ้น อ็อบเจ็กต์ดาวน์โหลดมีคุณสมบัติที่เสร็จสิ้นซึ่งส่งคืนโดยเมธอด isDone() เนื่องจากเมธอดนี้เรียกว่า isDone() แทนที่จะเป็น getDone( ) เราสรุปได้ว่าตัวแปรที่เสร็จแล้วนั้นเป็นบูลีนหรือบูลีน"
บรรทัดที่ 13-14
"หากเกิดข้อผิดพลาดระหว่างการดาวน์โหลด เมธอด downloadPhoto จะคืนค่า null เป็นการดีที่จะจัดการกับข้อผิดพลาด เป็นเรื่องไม่ดีที่จะส่งคืนค่า null เท่านั้น—ไม่ชัดเจนว่าข้อผิดพลาดคืออะไร จะเป็นการดีกว่าหากทิ้งข้อยกเว้นพร้อมข้อมูลเกี่ยวกับ ข้อผิดพลาด."
บรรทัดที่ 16
"เราคืนเส้นทางไปยังไฟล์ในเครื่องที่มีไฟล์ที่ดาวน์โหลด"
"โว้ว!"
"รหัสของโปรแกรมนี้ทำให้ชัดเจนว่ามันทำอะไร คุณยังสามารถเดาได้ว่าโปรแกรมถูกจัดระเบียบอย่างไร และเราจะพบคลาส/วิธีอื่นๆ อะไรบ้าง"
"ตอนนี้ฉันเข้าใจแล้วว่าชื่อมีความสำคัญเพียงใด"
"ข้อมูลเพิ่มเติมเกี่ยวกับชื่อ คุณมักจะเดาได้ว่าวัตถุ/คลาสมีเมธอดใด ตัวอย่างเช่น ถ้าออบเจกต์เป็นคอลเลกชัน ก็น่าจะมีเมธอด size() หรือ count() เพื่อให้ได้จำนวนองค์ประกอบ นอกจากนี้ มันอาจจะมีวิธี add() หรือ insert() องค์ประกอบถูกดึงมาจากคลาสคอลเลกชันโดยใช้เมธอด get/getItem/getElement"
"ถ้าเรียกตัวแปรว่า i, j หรือ k แสดงว่าตัวแปรนั้นน่าจะเป็นตัวนับลูป"
"ถ้าตัวแปรถูกเรียกว่า m หรือ n แสดงว่าตัวแปรนั้นน่าจะเป็นขนาดของอาร์เรย์/คอลเลกชัน"
"ถ้าตัวแปรถูกเรียกว่าชื่อ ตัวแปรนั้นน่าจะเป็นสตริงที่มีชื่อใครบางคนอยู่"
"หากเรียกคลาส FileInputStream คลาสนั้นจะเป็นไฟล์และอินพุตสตรีมพร้อมกัน"
"ยิ่งคุณเห็นโค้ดมากเท่าไหร่ การอ่านโค้ดของผู้อื่นก็จะยิ่งง่ายขึ้นเท่านั้น"
"แต่บางครั้งก็มีโค้ดที่อ่านยากมาก ในกรณีนี้ นี่คือคำแนะนำที่นำไปใช้ได้จริง:"
เคล็ดลับ |
---|
เขียนโค้ดราวกับว่ามันจะได้รับการดูแลโดยนักจิตวิทยาที่มีความรุนแรงซึ่งรู้ว่าคุณอาศัยอยู่ที่ไหน |
"มันตลกและไม่ตลกในเวลาเดียวกัน"
"ตอนนี้เล็กน้อยเกี่ยวกับรูปแบบที่ใช้ในการตั้งชื่อตัวแปร"
"นักพัฒนา Java พยายามตั้งชื่อที่ให้ข้อมูลสูงแก่ตัวแปรและเมธอด ด้วยเหตุนี้ ชื่อจึงมักประกอบด้วยคำหลายคำ รูปแบบการใช้อักษรตัวพิมพ์ใหญ่ของชื่อผสมมี 4 รูปแบบ"
1) ตัวพิมพ์เล็ก – คำทั้งหมดเขียนด้วยตัวพิมพ์เล็ก ตัวอย่างเช่น:
'เรือนกระจก' กลายเป็น 'เรือนกระจก'
'สาวฮอลลีวูด' กลายเป็น 'สาวฮอลลีวูด'
สไตล์นี้ใช้สำหรับชื่อแพ็คเกจ
2) ตัวพิมพ์ใหญ่ – คำทั้งหมดเขียนด้วยตัวพิมพ์ใหญ่และคั่นด้วยเครื่องหมายขีดล่าง ตัวอย่างเช่น:
'มูลค่าสูงสุด' กลายเป็น MAX_VALUE
'จำนวนแมว' กลายเป็น CAT_COUNT
"สไตล์นี้ใช้สำหรับชื่อของค่าคงที่ (ฟิลด์สแตติกสุดท้าย)"
3) CamelCase – คำทั้งหมดเขียนด้วยอักษรตัวพิมพ์เล็ก ยกเว้นอักษรตัวแรกของแต่ละคำจะเป็นตัวพิมพ์ใหญ่ ตัวอย่างเช่น:
'บ้านสีเขียว' กลายเป็น 'บ้านสีเขียว'
'สาวฮอลลีวูด' กลายเป็น 'สาวฮอลลีวูด'
สไตล์นี้ใช้สำหรับชื่อของคลาสและอินเทอร์เฟซ
4) Lower CamelCase (mixed case) – ทุกคำเขียนด้วยอักษรตัวพิมพ์เล็ก ยกเว้นตัวอักษรตัวแรกของแต่ละคำ ยกเว้นตัวแรกเป็นตัวพิมพ์ใหญ่ ตัวอย่างเช่น:
'รับความกว้าง'กลายเป็น 'getWidth'
'รับชื่อสาวฮอลลีวูด'กลายเป็น 'getHollywoodGirlName'
"สไตล์นี้ใช้สำหรับชื่อของตัวแปรและเมธอด"
“งั้นก็ไม่มีกฎอะไรมากมาย”
1) ทุกอย่างเขียนด้วย Lower CamelCase
2) ชื่อของคลาสและอินเตอร์เฟสจะใช้ตัวพิมพ์ใหญ่เสมอ
3) ชื่อแพ็คเกจจะเป็นตัวพิมพ์เล็กเสมอ
4) ค่าคงที่จะเป็นตัวพิมพ์ใหญ่เสมอ
"มีความแตกต่างเล็กน้อย แต่โดยทั่วไปนั่นคือสิ่งที่มันเป็น"
"ตอนนี้เกี่ยวกับวิธีการ "ชื่อเมธอดมักจะขึ้นต้นด้วยคำกริยา! 'นับ' เป็นชื่อที่ไม่ดีสำหรับวิธีการ เรียกว่า getCount() ดีกว่า วิธีการดำเนินการบางอย่างกับวัตถุ: startDownload , ขัดจังหวะ , สลีป , loadPirateMusic "
"อย่างที่คุณทราบ มีตัวรับและตัวตั้งสำหรับการทำงานกับคุณสมบัติ/ฟิลด์ของวัตถุ: getName / setName , getCount / setCountฯลฯ"
"ข้อยกเว้นเพียงอย่างเดียวสำหรับบูลีน สำหรับบูลีน ชื่อ getter ใช้ 'is' ไม่ใช่ 'get' เช่น isDone, isEmpty วิธีนี้ใกล้เคียงกับคำพูดทั่วไป"
"แล้วทำงานวันละสองชั่วโมงแทนที่จะเป็น 8 ชั่วโมงล่ะ ล่อลวงเหรอ"
"ใช่!"
"อย่างที่ควรจะเป็น สำหรับ Java Developer รุ่นเยาว์ ความต้องการพื้นฐานคือความเข้าใจอย่างดีเยี่ยมเกี่ยวกับพื้นฐานของ Java นั่นคือ Java Core"
"ฉันมีคำถามอื่น ทำไมเราถึงมีวิธีที่แตกต่างกันในการรับจำนวนองค์ประกอบเหล่านี้"
ระดับ | วิธีการ/คุณสมบัติในการรับจำนวนองค์ประกอบ |
---|---|
สตริง | ความยาว () |
อาร์เรย์ | ความยาว |
รายการอาร์เรย์ | ขนาด () |
กลุ่มเธรด | จำนวนใช้งาน() |
"ก่อนอื่น Java ถูกประดิษฐ์ขึ้นเมื่อกว่า 20 ปีที่แล้ว ก่อนที่จะมีการกำหนดข้อกำหนดอย่างsetCount / getCountและมีแนวทางทั่วไปที่นำมาจากภาษา C เพื่อ 'ทำให้สั้นที่สุด'"
"ประการที่สอง ความหมายมีบทบาทที่นี่ เมื่อพูดถึงอาร์เรย์ เราจะพูดถึงความยาวของมัน เมื่อพูดถึงคอลเลกชัน เราจะพูดถึงขนาดของมัน"
"ช่างเป็นบทเรียนที่น่าสนใจ"
"ฉันอยากจะบอกคุณมากกว่านี้ แต่ฉันเกรงว่าคุณจะจำได้ไม่หมดในคราวเดียว จะดีกว่าที่จะเสิร์ฟให้คุณในมื้อเล็กๆ"
"แต่ฉันต้องการสัมผัสรูปแบบเกี่ยวกับการใช้วงเล็บปีกกา: {} มีสองวิธี:"
1) วงเล็บขึ้นบรรทัดใหม่ทุกครั้ง
2) วงเล็บเปิดไปที่ส่วนท้ายของบรรทัดก่อนหน้าในขณะที่วงเล็บปิดอยู่ในบรรทัดใหม่ ลักษณะนี้เรียกว่า 'การจัดฟันแบบอียิปต์'
"พูดตามตรง คุณสามารถเลือกวิธีการเขียนโค้ดได้ หลายคนใช้เครื่องหมายปีกกาเปิดในบรรทัดเดียวกัน หลายคนใส่ไว้ในบรรทัดใหม่ มันเหมือนกับการถกเถียงกันว่าไข่จะแตกปลายไหน ปลายเล็กหรือใหญ่ จบ."
"สิ่งเดียวที่ฉันแนะนำได้คือให้ยึดติดกับสไตล์ใดก็ตามที่ใช้ในโปรเจกต์ที่คุณทำอย่าเปลี่ยนโค้ดของคนอื่นให้ตรงกับสไตล์ที่คุณ ชอบ ผู้คนไม่สมบูรณ์แบบ ฉันกำลังบอกคุณในฐานะด็อกเตอร์ Bilaabo "
"ขอบคุณสำหรับบทเรียนที่น่าสนใจ บิลาโบ ฉันจะไปทบทวนสิ่งที่คุณพูด"
GO TO FULL VERSION