เหตุใดฟิลด์ส่วนใหญ่ (สมาชิกคลาส) ในการกวดวิชา Android เริ่มต้นด้วย `m`


446

ฉันรู้เกี่ยวกับกฎกรณีอูฐ แต่ฉันสับสนกับกฎมนี้ มันหมายถึงอะไร ฉันเป็นนักพัฒนา PHP "เรา" ใช้ตัวอักษรตัวแรกของตัวแปรเป็นตัวบ่งชี้ชนิดเช่น 'b' สำหรับบูลีน 'i' สำหรับจำนวนเต็มเป็นต้น

เป็น 'm' สิ่ง Java หรือไม่ มันยืนสำหรับมือถือ? ผสม?


281
คำนำหน้านั้นไม่ทำอะไรเลยนอกจากจะทำให้อ่านง่ายขึ้น
Dapeng

10
การระบุชนิดเป็นคำนำหน้าไม่ดีและเรียกว่าสัญกรณ์ฮังการีดูthc.org/root/phun/unmaintain.htmlและkernel.org/doc/Documentation/CodingStyle
Muayyad Alsadi

10
เพราะพวกเขาไม่มีความรู้เกี่ยวกับรูปแบบโค้ดจาวามากนัก
Victor Ionescu

10
ในความคิดของฉันถ้าคุณมีปัญหาในการแยกแยะตัวแปรท้องถิ่นจากตัวแปรสมาชิกคุณมีปัญหาใหญ่กว่าการปฏิบัติตามข้อกำหนดของรหัส นี่คือการประชุมที่ฉันใช้ (บางครั้ง): Long Life, Long Name ชีวิตสั้นชื่อย่อ ยังไม่เคยสับสน
แบรนดอน

17
คำนำหน้าโง่จริง ใช้ IDE ของคุณเพื่อสร้าง setters / getters และคุณจะได้รับ getmName () และ setmName ()! นอกจากนี้เครื่องมืออย่างลอมบอกสำหรับผู้สร้างรุ่นผู้ได้รับสิ่งก่อสร้าง ฯลฯ จะสร้างคำนำหน้า m ในตัวเลือกของฉันคำนำหน้า m ไม่เพิ่มมูลค่าและควรถูกลบออกจากแบบแผนการตั้งชื่อ
userM1433372

คำตอบ:


552

สัญลักษณ์นี้มาจาก AOSP (Android Open Source Project) แนวทางสไตล์โค้ดสำหรับผู้มีส่วนร่วม :

ทำตามอนุสัญญาการตั้งชื่อฟิลด์

  • ชื่อฟิลด์ที่ไม่ใช่แบบสาธารณะและไม่คงที่เริ่มต้นด้วย m
  • ชื่อฟิลด์คงที่เริ่มต้นด้วย s
  • ฟิลด์อื่นเริ่มต้นด้วยตัวอักษรตัวพิมพ์เล็ก
  • ฟิลด์คงที่สุดท้ายสาธารณะ (ค่าคงที่) คือ ALL_CAPS_WITH_UNDERSCORES

โปรดทราบว่าคู่มือสไตล์ที่เชื่อมโยงนั้นใช้สำหรับรหัสที่จะมีส่วนร่วมใน Android Open Source Project

มันไม่ใช่คู่มือสไตล์สำหรับรหัสของแอพ Android แต่ละตัว


33
ที่น่าสนใจ .. สไตล์ของ Google Code Javaจริงขัดแย้งกับสไตล์รหัส AOSPเกี่ยวกับเรื่องนี้
Gautam

51
ฉันคิดว่าในเวลาเหล่านี้มันไร้สาระโดยเฉพาะอย่างยิ่งที่จะทำในแอปของคุณ! "คลาสและฟังก์ชันของคุณควรมีขนาดเล็กพอที่คุณไม่ต้องการและคุณควรใช้สภาพแวดล้อมการแก้ไขที่เน้นหรือทำให้สีของสมาชิกชัดเจนขึ้นนอกจากนี้ผู้คนก็เรียนรู้ที่จะเพิกเฉยต่อคำนำหน้า (หรือคำต่อท้าย) อย่างรวดเร็ว ส่วนที่มีความหมายของชื่อยิ่งเราอ่านรหัสมากเท่าไหร่เราก็ยิ่งเห็นส่วนนำหน้าน้อยลงในที่สุดคำนำหน้าจะกลายเป็นสิ่งที่มองไม่เห็น - Robert Martin ใน Clean Code
mikugo

4
ขัดแย้งคู่มือ Java สไตล์ของ Google - "ชื่อฟิลด์ที่ไม่คงที่ (คงที่หรืออย่างอื่น) เขียนด้วยlowerCamelCase ... ตัวอย่างเช่นcomputedValues... "
AlikElzin-kilaka

สำหรับแต่ละแอพฉันจำเคล็ดลับดี ๆ ที่แนะนำให้ใช้อักษรตัวพิมพ์เล็กของชื่อแอพแทน 'm'
abcoep

4
โปรดเพิ่มความคิดเห็นของคุณในคำร้องนี้เพื่อลบกฎcode.google.com/p/android/issues/detail?id=226814
likejudo

83

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


90
IDE ที่ทันสมัยทั้งหมดสร้างความแตกต่างให้กับคนในท้องถิ่นและสมาชิกตามสี / แบบอักษรซึ่งเป็นวิธีที่ IMHO สามารถอ่านได้มากกว่าmคำนำหน้า
Dzmitry Lazerka

5
ตกลง ฉันพบว่าสิ่งที่น่ารำคาญมาก แต่เนื่องจาก IntelliJ เป็นคนที่ยอดเยี่ยม
ZakTaccardi

โปรดเพิ่มความคิดเห็นของคุณในคำร้องนี้เพื่อลบกฎcode.google.com/p/android/issues/detail?id=226814
likejudo

4
@DzmitryLazerka ในเครื่องมือตรวจสอบโค้ดส่วนใหญ่คุณไม่มีการเน้นระดับนี้ ดังนั้นจึงสมเหตุสมผลในโครงการโอเพ่นซอร์สขนาดใหญ่
JWqvist

@DzmitryLazerka สิ่งที่เกี่ยวกับการอ่านรหัสใน notepad หรือ github และอื่น ๆ ?
user924

57

mคำนำหน้าคืออะไร?

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

ควรใช้เมื่อใด

private String mCityName;
private float mTemperature;

เมื่อไม่ใช้

public static int mFirstNumber;
public static final String mDATABASE_NAME;

สิ่งที่ฉันทำ?

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

ข้อสรุป

ใช้? "ใช่" หรือ "ไม่" เป็นตัวเลือกส่วนบุคคลของคุณ


1
คุณสามารถใช้มันได้public static intแต่ใช้sแทนm: public static int sFirstNumber;ดูstackoverflow.com/a/49453184/7767664
924

31

ถ้าเป็นตัวแปรสมาชิกในคลาส 'm' หมายถึง 'สมาชิก' โปรแกรมเมอร์ Java หลายคนทำเช่นนั้นถึงแม้ว่าจะมี IDE สมัยใหม่ไม่จำเป็นต้องใช้เนื่องจากคุณมีการเน้นเมาส์บนคำแนะนำเครื่องมือ ฯลฯ


9
ฉันจะยืนยันว่าแม้จะมี IDE ที่ทันสมัยมันเป็นเรื่องดีที่จะนำหน้าสมาชิกด้วย m หรือ m_ เพื่อจุดประสงค์ในการนำตัวแปรสมาชิกทั้งหมดสำหรับชั้นเรียนในที่เดียวกันเมื่อใช้การเติมโค้ดให้สมบูรณ์ ซึ่งหมายความว่าเมื่อคุณทำงานในชั้นเรียนคุณสามารถกด m_ + ctrl space เพื่อรับรายชื่อสมาชิกทั้งหมด
Nailer

38
Nailer คุณสามารถทำสิ่งเดียวกันได้โดยใช้สิ่งนี้ + ctrl space :)
Romain Guy

3
นอกจากนี้หากคุณพิมพ์รายชื่อรหัสนั้นมีประโยชน์ - คุณไม่มีคำแนะนำเครื่องมือที่จะช่วยคุณออกจากที่นั่น (ใช่ฉันชอบพิมพ์รหัสและอ่านในเก้าอี้ง่าย ๆ หรือแม้กระทั่งบนเตียงในบางครั้ง)
B. Clay Shannon

3
@ โดนินิคฉันไม่ใช่มืออาชีพ แต่ฉันเดาว่าความคิดคือการแยกแยะความแตกต่างระหว่างคุณลักษณะต่าง ๆ ในชั้นเรียน ที่ถูกกล่าวว่าฉันมักจะไม่ใช้คุณลักษณะที่ไม่คงที่สาธารณะได้ทุกที่ยกเว้นในชั้นเรียนที่มีคุณลักษณะเฉพาะเหล่านั้นและไม่มีตรรกะทางธุรกิจ (ชั้นเรียนบันทึก) ในกรณีนี้ m ไม่มีประโยชน์เนื่องจากไม่มีตรรกะทางธุรกิจในชั้นเรียน ดังนั้นจึงเป็นการดีกว่าที่จะลบออกเพื่อให้สามารถอ่านได้นอกคลาส (เมื่อคุณอ้างอิงฟิลด์เหล่านี้)
Joffrey

2
ในความคิดของฉันหากคุณไม่สามารถแยกแยะความแตกต่างระหว่างฟิลด์พารามิเตอร์และตัวแปรได้อย่างง่ายดายโดยไม่ใช้ส่วนนำหน้าดังกล่าวหมายความว่ามีบางอย่างผิดปกติกับรหัส เป็นไปได้ว่าคลาสหรือวิธีการนั้นใหญ่เกินไป
Konrad Morawski

9

อ้างอิงจากหนังสือ Clean Code ไม่ใช่รหัสสะอาด

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


9

หากคุณมีปัญหาเช่น

IDE ของคุณเพื่อสร้าง setters / getters และคุณท้ายด้วย getmName () และ setmName ()

อย่าลืมที่จะทำต่อไป ( การตั้งค่า / แก้ไข / สไตล์รหัส / Java / การสร้างรหัส ):

ป้อนคำอธิบายรูปภาพที่นี่

อัปเดต:เราไม่ได้ใช้สิ่งนี้ใน Kotlin (ดังนั้นจึงเป็นการดีกว่าที่จะเปลี่ยนเป็นและไม่ใช้คำนำหน้าอีกต่อไป)


6

ฉันคิดว่ามันเป็นเรื่องส่วนตัวมาก ๆ ที่ใช้รหัสการประชุม ฉันต้องการตั้งชื่อตัวแปรของฉันด้วยคำนำหน้าต่อไปนี้:

  • m - ตัวแปรเมธอด
  • c - ตัวแปรระดับ
  • p - ตัวแปรพารามิเตอร์

แต่ฉันเดาว่าโปรแกรมเมอร์แต่ละคนมีสไตล์ของตัวเอง


7
เมื่อพิจารณาว่า Java devs ส่วนใหญ่ใช้ IDE ซึ่งอนุญาตให้ตั้งค่าสไตล์การมองเห็นที่แตกต่างกันสำหรับคลาส, เมธอด, สแตติก, และพารามิเตอร์ฉันพบว่ามีประโยชน์มากกว่าที่จะมีตัวอย่างเช่นตัวแปรสแตติก / เมธอดที่ขีดเส้นใต้ คุณสามารถตั้งค่าแบบอักษรและสีของคุณเอง และมันจะทำงานได้เสมอไม่ว่าคุณจะใช้คำนำหน้าอะไร แต่แน่นอนว่าเวทย์มนตร์จะหายไปเมื่อคุณออกจาก IDE
ccpizza

4

เพื่อพิสูจน์ว่าคุณไม่ควรปฏิบัติตามอนุสัญญานี้ในการตั้งชื่อตัวแปรในรหัสของคุณฉันต้องส่งภาพหน้าจอจากAndroid Studio ของผู้ปกครองที่นี่

ค้นหาตัวแปรที่อยู่ในวัตถุที่เรียงลำดับเป็นพิเศษเพื่อวางตัวแปร m ต่ำกว่าตัวแปรเนทีฟของคุณ ดังนั้นโดยตั้งชื่อพวกเขาในรหัสของคุณด้วย "m" คำนำหน้าคุณซ่อนไว้ในกองจากตัวเอง

ป้อนคำอธิบายรูปภาพที่นี่


3

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


2

ดังที่ได้กล่าวไว้ก่อนหน้านี้มันเป็นสไตล์สำหรับตัวแปรที่แตกต่าง แต่มันก็มีประโยชน์มากสำหรับการสร้างรหัส หากคุณกด "Alt + Insert" คุณจะได้รับ windows สำหรับคุณสมบัติการสร้างรหัสทั่วไป หากคุณต้องการสร้างวิธี "รับ" สำหรับตัวแปรของคุณคุณจะได้รับ

public class Foo{
   private int bar;

   public int getBar(){
       return this.bar;
   }

   public void setBar(int bar){
       this.bar = bar; 
   }

}

แต่ถ้าคุณประกาศ "m, s" คุณจะได้รับ:

public class Foo{
private int mBar;

public int getBar(){
   return mBar;
}

public void setBar(int bar){
   mBar = bar;
}
}

มันจะถูกสร้างขึ้นโดยอัตโนมัติและ "m" หรือ "s" ถูกลบออกจากตัวสร้างของคุณรับและตั้งชื่อวิธีการ หลังจากนี้ "รับ" "และ" ตั้ง "สำหรับฟิลด์จะถูกสร้างขึ้นโดยไม่มี" m " Andoroid Fle-> Setting-> Style Code-> Java-> Genenretion Code และทำตามภาพ บางทีมันอาจจะช่วย ขอโทษด้วยสำหรับฉัน กำหนดค่า android


2

ดูเหมือนจะเป็นการตั้งค่าส่วนตัวของวิศวกร Android / Google รุ่นแรก ๆ เพื่อเริ่มใช้ตัวแปรสมาชิกด้วย 'm' และพวกเขาจึงแนะนำ

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

โปรดเพิ่มความคิดเห็นของคุณในการสนับสนุนคำร้องนี้เพื่อลบกฎhttps://code.google.com/p/android/issues/detail?id=226814


2

ตามหลักการของการอ่านmสำหรับตัวแปรสมาชิกและsเขตข้อมูลแบบคงที่ไม่ควรใช้อีกต่อไปหากคุณใช้ IDE สมัยใหม่เช่น Android Studio Android สตูดิโอสามารถแยกความแตกต่างระหว่างคนโดยไม่ต้องเพิ่มหรือms


1

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

    private double mRadius;

แต่ในเวลาเดียวกันคุณต้องการให้ตัวนับติดตามวงกลมทั้งหมดภายในคลาสวงกลมที่คุณมี

    private static int sCircleCount;

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


1

ต่อไปนี้เป็นแบบแผนการตั้งชื่อ

  • ชื่อฟิลด์ที่ไม่ใช่แบบสาธารณะและไม่คงที่เริ่มต้นด้วย m
  • ชื่อฟิลด์คงที่เริ่มต้นด้วย s
  • ฟิลด์อื่นเริ่มต้นด้วยตัวอักษรตัวพิมพ์เล็ก
  • ฟิลด์คงที่สุดท้ายสาธารณะ (ค่าคงที่) คือ ALL_CAPS_WITH_UNDERSCORES

ตัวอย่าง:

public class MyClass {
    public static final int SOME_CONSTANT = 42;
    public int publicField;
    private static MyClass sSingleton;
    int mPackagePrivate;
    private int mPrivate;
    protected int mProtected;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.