"สวัสดี 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 "

"ขอบคุณสำหรับบทเรียนที่น่าสนใจ บิลาโบ ฉันจะไปทบทวนสิ่งที่คุณพูด"