แนวทางการตั้งชื่อวิธีการกระชับความหมายที่มีความหมาย


25

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

ฉันกำลังคิดถึงแนวทางบางอย่างเกี่ยวกับการตั้งชื่อฉันทราบถึงแนวทางมากมายที่สนใจเฉพาะปลอกตัวอักษรหรือหมายเหตุง่ายๆ ที่นี่ฉันกำลังมองหาแนวทางสำหรับการตั้งชื่อที่มีความหมาย แต่ยังรัดกุม

ตัวอย่างเช่นนี่อาจเป็นส่วนหนึ่งของแนวทางที่ฉันดูแล:

  • ใช้เพิ่มเมื่อรายการที่มีอยู่กำลังจะถูกเพิ่มไปยังเป้าหมายใช้สร้างเมื่อรายการใหม่จะถูกสร้างและเพิ่มลงในเป้าหมาย
  • ใช้ลบเมื่อรายการที่มีอยู่กำลังจะถูกลบออกจากเป้าหมายใช้ลบเมื่อรายการจะถูกลบอย่างถาวร
  • จับคู่เมธอด AddXXX กับ RemoveXXX และจับคู่เมธอด CreateXXX กับเมธอด DeleteXXX แต่อย่าผสมวิธีเหล่านั้น

จากตัวอย่างข้างต้นแสดงให้เห็นว่าฉันต้องการหาข้อมูลออนไลน์บางอย่างที่ช่วยฉันในการตั้งชื่อและรายการอื่น ๆ ที่สอดคล้องกับไวยากรณ์ภาษาอังกฤษและความหมายของคำ

คำแนะนำข้างต้นอาจใช้งานง่ายสำหรับเจ้าของภาษา แต่สำหรับฉันแล้วว่าภาษาอังกฤษเป็นภาษาที่สองของฉันฉันต้องได้รับการบอกเล่าเกี่ยวกับสิ่งต่าง ๆ เช่นนี้


ยินดีต้อนรับสู่เว็บไซต์! คุณอาจพบคำถามที่เกี่ยวข้องนี้เป็นประโยชน์: programmers.stackexchange.com/questions/14169/…
Adam Lear

1
ฉันคิดว่าส่วนรวบรัดสำคัญกว่าส่วนที่มีความหมายเนื่องจากรูปแบบของคุณมีความหมายอยู่แล้ว หากคุณกำลังจะไปไมล์พิเศษทำมันเพื่อความมั่นคง
yannis

7
คำอธิบายสำคัญกว่ารัดกุม ข้อเสนอของ IDE ส่วนใหญ่เสร็จสิ้นดังนั้นความยาวไม่ควรเป็นอุปสรรคและชื่อที่อธิบายนั้นง่ายต่อการเข้าใจและจดจำ
Caleb

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

3
การอ่านมีความสำคัญมากกว่าความรัดกุม IDE ที่ทันสมัยทั้งหมดมีสิ่งอำนวยความสะดวกในการทำโค้ดให้สมบูรณ์ดังนั้นจึงง่ายต่อการค้นพบว่าวิธีการใดมีค่ามากกว่าการพิมพ์ให้ง่ายขึ้น

คำตอบ:


34

การตั้งชื่อ หนึ่งในสิ่งที่ยากที่สุดเกี่ยวกับการพัฒนาซอฟต์แวร์ :)

เมื่อฉันตั้งชื่อบางสิ่งนี่เป็นลำดับความสำคัญของฉัน:

  • ติดตามสำนวนภาษาของฉัน Ruby ชอบขีดล่าง จาวาสคริปต์ชอบกรณีอูฐ ไม่ว่าคุณจะใช้ภาษาอะไร
  • แสดงเจตนาของ API มันไม่ใช่ "send_http_data" มันคือ "post_twitter_status"
  • หลีกเลี่ยงการรั่วไหลของรายละเอียดการใช้งาน กล่าวว่านำหน้าตัวแปรด้วยชนิด
  • ห้ามใช้อักขระเกินความจำเป็นโดยไม่ทำผิดหลักเกณฑ์ก่อนหน้า

เห็นได้ชัดว่านี่เป็นวิธีการที่ค่อนข้างง่าย การตั้งชื่อเหมาะสมยิ่ง

สำหรับการวิจัยเพิ่มเติมฉันขอแนะนำให้อ่านThe Art of Readable Codeเนื่องจากให้คำแนะนำที่ดีและกระชับเกี่ยวกับการตั้งชื่อเมธอด สำหรับการวิจัยเพิ่มเติมฉันไม่สามารถแนะนำClean Codeของ Bob Martin ได้มากกว่านี้


2
+1 สำหรับคำตอบที่ดีและแนะนำ Clean Code ฉันขอแนะนำหนังสือเล่มนี้เช่นกัน อีกสิ่งหนึ่งที่ฉันจะเพิ่มและนี่คือจากหนังสือของมาร์ติน: "ฉันต้องการโค้ดง่ายต่อการเขียนเช่นกัน" นั้นมีความสำคัญต่ำกว่ามากเมื่อเทียบกับการอ่านโค้ด เห็นได้ชัดว่ามีบางอย่างในชื่อที่ยาวเกินไป แต่ฉันมักจะเอนเอียงไปทางชื่อยาวที่อ่านได้มากกว่าสิ่งที่เขียนได้ง่าย นอกจากนี้ IDE ที่ทันสมัยที่สุดยังมีระบบเติมข้อมูลอัตโนมัติอีกด้วย
DXM

3
แนวคิดที่สำคัญอีกข้อหนึ่งจากหนังสือของ Robert Martin: สำหรับวิธีการ - ชื่อขอบเขตสั้นยาว, ชื่อขอบเขตสั้นยาว สำหรับตัวแปรชื่อสั้น - ขอบเขตสั้นกลับ, ชื่อยาวขอบเขตยาว
Patkos Csaba

"Clean Code" เป็นหนังสือที่ยิ่งใหญ่ที่สุดที่ช่วยให้ฉันเข้าใจถึงผลกระทบของการอ่านรหัสและระบุวิธีปฏิบัติที่ดีที่สุดที่ฉันติดตามเป็นประจำ
Paul

คำถามหนึ่งที่เปิดเผยเจตนาในชื่อเมธอดไม่ส่งผลต่อความสามารถในการนำกลับมาใช้ใหม่ได้หรือไม่ post_twitter_status ทำให้เจาะจงเกินไป
EresDev

ใช่และไม่. วิธีการเฉพาะนั้นอาจใช้งานได้น้อยลง แต่คุณสามารถแยกวิธีการที่มีพฤติกรรมแกนย้ายไปยังชั้นเรียนทั่วไปมากขึ้นและออกจากวิธีการเดิมเป็น "ตะเข็บ" วิธีนี้หากคุณต้องการหลีกเลี่ยงการทำซ้ำคุณสามารถทำได้โดยไม่ต้องเปลี่ยนส่วนต่อประสาน
Zee

7

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

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

ในตอนท้ายของวันที่คุณต้องการหลีกเลี่ยงรหัสน่าเกลียดที่มีชื่อที่ใช้ทั้งแถวหรือที่กะล่อนเพื่อปล้นพวกเขาจากค่าของพวกเขา


6

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

  • class / method / variable ทำอะไรเช่นอะไรคือจุดประสงค์ที่กว้างกว่าและมันมีไว้เพื่ออะไร?
  • มันเกี่ยวกับจุดประสงค์ของมันโดยเฉพาะในการสื่อสารคืออะไรคือส่วนสำคัญที่ชื่อต้องมีในมันคืออะไร?

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

รหัสควรเป็น เอกสารด้วยตนเองนั่นคือการตั้งชื่อของคุณควรทำให้ชัดเจนว่ามีอะไรเกิดขึ้นบ้าง หากคุณจำเป็นต้องอธิบายว่าบรรทัดของโค้ดทำอะไรในความคิดเห็นและการเปลี่ยนชื่อสิ่งต่าง ๆ ไม่ได้ปรับปรุงให้ดีพอคุณควรพิจารณาการเปลี่ยนบรรทัดนั้นเป็นวิธีการใหม่อย่างจริงจังด้วยชื่อที่อธิบายอย่างเหมาะสมเพื่อให้การอ่านวิธีดั้งเดิม การเรียกใช้เมธอดใหม่จะอธิบายสิ่งที่เกิดขึ้น อย่ากลัวที่จะมีชื่อยาว แน่นอนว่าคุณไม่ควรเขียนนวนิยายในชื่อ class / method / variable แต่ฉันควรมีชื่อยาวเกินไปและอธิบายสั้นเกินไปและฉันต้องหาว่ามันทำอะไรโดยดูจากกระโปรงหน้ารถ ยกเว้นบางข้อยกเว้นที่ชัดเจนเช่นพิกัด x / y และตัวย่อที่ใช้กันทั่วไปหลีกเลี่ยงชื่อตัวอักษรและตัวย่อ เรียกบางอย่าง "bkBtn" แทน "backButton"

เท่าที่ภาษาของคุณอนุญาตให้ทำให้โค้ดของคุณอ่านเหมือนประโยคภาษาอังกฤษ วัตถุใช้คำนามวิธีการใช้คำกริยา โดยทั่วไปแล้ววิธีการบูลีนเริ่มต้นด้วย "คือ" แต่มีตัวเลือกอื่น ๆ อีกมากมายที่ถ่ายทอดความหมายได้ดียิ่งขึ้นทั้งนี้ขึ้นอยู่กับกรณีการใช้งานเช่น "สามารถ", "ควร" หรือ "ไม่" แน่นอนว่าไม่ใช่ทุกภาษาที่สามารถทำได้ดีเท่ากับสมอลล์ทอล์คในเรื่องนี้ แต่โดยทั่วไปสัญลักษณ์บางอย่างก็เป็นที่เข้าใจกันว่าเป็นส่วนหนึ่งของประโยค ข้อตกลง Smalltalk สองประการที่ฉันชอบที่จะนำไปใช้กับภาษาอื่น ๆ ให้มากที่สุดเท่าที่จะทำได้คือการใส่คำนำหน้าชื่อของพารามิเตอร์แบบวนรอบด้วย "แต่ละ" และวิธีนำหน้าพารามิเตอร์ด้วยบทความ "a" (หรือ "เป็น" หรือ "บางส่วน") . นี่อาจไม่ใช่มาตรฐานทั่วไปใน Java และทุกคนยินดีที่จะละเว้นบิตนี้ แต่ฉันพบว่าสิ่งนี้ช่วยเพิ่มความสามารถในการอ่านรหัสอย่างมาก ตัวอย่าง (ตัวอย่างใน Java):

public boolean shouldConsiderAbbreviating(List<String> someNames) {
  for (String eachName : someNames) {
    if (isTooLong(eachName)) {
      return true;
    }
  }
  return false;
}

สิ่งนี้ควรอ่านได้สำหรับผู้ที่มีความรู้เกี่ยวกับ Java เล็กน้อยเช่นนี้:

ในการตรวจสอบว่าคุณควรพิจารณาตัวย่อของรายชื่อบางชื่อ (ซึ่งเป็นสตริง) ย้ำผ่านบางชื่อและสำหรับแต่ละชื่อพิจารณาว่ายาวเกินไปหรือไม่ ถ้าเป็นเช่นนั้นกลับมาtrue; falseถ้าไม่มียาวเกินไปกลับ

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


3

การค้นหาการตั้งชื่อที่ดีนั้นเป็นสิ่งที่ประนีประนอมระหว่างปัจจัยต่างๆ คุณจะไม่พอใจอย่างเต็มที่

ที่กล่าวถึงแม้ว่าภาษาแม่ของคุณจะไม่เป็นเช่นนั้นให้พิจารณาว่าภาษาอังกฤษเป็นภาษาที่มีการเขียนโปรแกรมโทเค็นภาษา การใช้ไวยากรณ์ที่คล้ายภาษาอังกฤษทำให้โค้ดอ่าน "คล่องแคล่ว" มากขึ้นเนื่องจากไม่มี "กฎการอ่านที่ใช้งานไม่ได้" ทุกครั้งที่พบคำหลัก

โดยทั่วไปพิจารณาสิ่งชอบเพื่อให้ตรงกับรูปแบบเช่นobject.method(parameters)subject.verb(complements)

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

เกี่ยวกับคำนามเรียนควรได้รับการตั้งชื่อตามสิ่งที่พวกเขาare(ในรูปของแนวคิด) are forในขณะที่วัตถุสำหรับสิ่งที่พวกเขา

ที่กล่าวว่าระหว่างlist.add(component)และcomponent.add_to(list)ชอบแรก โดยทั่วไปคำกริยา "active transitive" จะเป็นตัวแทนของการกระทำที่เคารพต่อกริยาแฝงหรือการสะท้อนกลับที่ดีกว่า หากไม่มีข้อ จำกัด ในการออกแบบ


2

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

สิ่งที่สำคัญก็คือชื่อที่คุณเลือกสำหรับชั้นเรียนของคุณ สิ่งเหล่านี้มีบริบทมากมายเมื่อดูที่ชื่อเมธอด ลายเซ็นวิธีการเช่น:

public User Find(int userId);

เข้าใจง่ายกว่า:

public Person Find(int personId);

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


1

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

บางแพลตฟอร์มต้องการชื่อสั้น ๆ (ตัวอย่างเช่นใน Win32 C API _tcsstrเป็นฟังก์ชั่นในการค้นหาสตริงภายในสตริง - มันไม่ชัดเจนใช่หรือไม่) บางแพลตฟอร์มใช้สำหรับการอ่านเพื่อความกระชับ (ในกรอบ Cocoa ของ Apple สำหรับ Objective-C วิธีการแทนที่สตริงย่อยในสตริงด้วยสตริงอื่นและส่งคืนผลลัพธ์เมื่อมีการคัดลอกเรียกว่าstringByReplacingOccurrencesOfString: withString:) ฉันพบว่าเข้าใจง่ายกว่าหลังมากและเขียนได้ยากขึ้นพอสมควร

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


1
  1. สมมติว่าเป็นภาษาอังกฤษเว้นแต่ว่านักพัฒนาซอฟต์แวร์ทุกคนที่เคยทำงานกับรหัสนี้จะพูดภาษาที่ไม่ใช่ภาษาอังกฤษเดียวกัน

  2. ศึกษาแบบแผนและรูปแบบการตั้งชื่อที่ยอมรับกันทั่วไป หลักการแนวทางของคุณควรมีความชัดเจน ลักษณะแตกต่างกันไปตามภาษาการเขียนโปรแกรม

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


แม้ว่านักพัฒนาซอฟต์แวร์ทุกคนที่ทำงานบนรหัสจะพูดภาษาที่ไม่ใช่ภาษาอังกฤษยังคงใช้ภาษาอังกฤษ ... !
Mvision

0
  1. ใช้คำนำหน้า หากมีการใช้วิธีการหลายอย่างเพื่อทำสิ่งที่คล้ายกันหรืออาจจัดกลุ่มเข้าด้วยกันให้ใส่คำนำหน้าร่วมกันก่อนชื่อของพวกเขาเพื่อแสดงว่าวิธีการเหล่านี้มีอะไรเหมือนกัน
  2. อย่าใช้ตัวย่อที่ไม่ชัดเจนหากคุณต้องการให้ผู้อื่นเข้าใจชื่อได้ทันที (สำคัญในการตั้งชื่อ API)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.