اثنين C# اصطلاحات التسمية:ماذا تعتقد ؟ [مغلقة]

StackOverflow https://stackoverflow.com/questions/823294

  •  05-07-2019
  •  | 
  •  

سؤال

لدي اثنين محددة C# الترميز الاتفاقيات كنت أتدرب مع مشاعر مختلطة.سأكون من الغريب أن نسمع ما يظن الناس.وهم:

#1.اسم الحالات بعد الطبقة إنه مثيل, camelCased

#2:"مطابقة الأسماء الملكية"

هنا هو الأساس المنطقي:

#1.اسم الحالات بعد الطبقة إنه مثيل, camelCased

أنا استخدم هذا الإعداد الافتراضي اصطلاح التسمية.بالطبع هناك استثناءات.ولكن استخدامها على الدوام في ذلك بشكل كبير يحسن رمز الوضوح و الصيانة.رمز يبدو مثل هذا:

var dataConnection = new DataConnection();
//not: var dataConn, dbConn, sqlConn, myDbPickOfTheDay etc.

FileInfo fileInfo = new FileInfo();

Timer timer = new Timer(); 

//etc.

أنا في هذه النقطة حيث رمز مثل هذا يسبب لي الألم الجسدي:

DataConnection dbConn = new DataConnection();

لا أستطيع أن أؤكد بما فيه الكفاية كم هذه الاتفاقية قد اتخذت بعيدا عن الألم والغضب من اسم المتغير اللعبة.

هذه الاتفاقية هي في تناقض حاد مع محاولة الاسم الأشياء في الطرق التي تحاول أن تشير إلى ما سبيل المثال ، والذي يصل إلى محاولة خلاق تضمين الأعمال في التعليمات البرمجية.رمز طريقة الحصول على بتعميل الترميز إلى النقطة حيث تلك الأسماء الأصلية هي مضللة في أحسن الأحوال.

بالنسبة لي هذه الاتفاقية هو الذهب.كما يمنع الرهيبة الممارسة من أنب قليلا متغير أسماء لنفس الشيء.

مثال على هذه الاتفاقية في الممارسة:

class Person { ...
   public string FirstName { get; set; }

//and then
var person = new Person();
person.FirstName = firstName; //where firstName comes from somewhere else.

من السهل جدا للقراءة.مملة جدا.مملة هي جيدة عندما يتعلق الأمر بالحفاظ على القانون.

ومع ذلك, هذه الاتفاقية يقودني إلى #2:

#2 "مطابقة الأسماء الملكية" ( لعدم وجود عنوان أفضل )

هنا مثال:

public class ShoppingCart { ..
  private Item item;
  public Item Item {  //<---- ?
  get { return this.item; } ...

المترجم سعيد تماما مع هذا.و في الواقع فإنه يعرض واجهة جميلة جدا:

//notice how tempting it is to just say "ShoppingCart cart ... "
ShoppingCart shoppingCart = new ShoppingCart();  
shoppingCart.Item = item;

الآن البديل هو أن تكون خلاقة -- تحتاج فعلا إلى حشد اثنين جيدة متغير أسماء البند:الممتلكات العامة و الخاصة الأعضاء اسم المتغير.

كم من المرات رأيت هذا و فقط أريد أن يتقاعد على الفور ؟

 public class ShoppingCart { ..
      private Item cartItem;
      public Item ShoppingCartItem { 
      get { return this.cartItem; } ..
  ///....
  ShoppingCart userShoppingCart = new ShoppingCart();
  userShoppingCart.ShoppingCartItem = userSelection;

أشعر بقوة كافية حول الاتفاقية رقم 1 أن أعتقد أنني يمكن أن يعيش مع #2.

ماذا تعتقد ؟

هل كانت مفيدة؟

المحلول

في حال أنك لم تكن على علم و إذا كنت تهتم , C# لديها بالفعل تسمية معيار

http://msdn.microsoft.com/en-us/library/xzf533w0(مقابل.71).aspx

أيضا, النظر في الاتفاقيات مرة أخرى ...هنا بعض الاقتراحات.

  • fileInfo تبدو جميلة بجوار FileInfo ولكن ليس لديها أي معنى سوى انها من النوع الذي لا يمكن أن تحصل بسرعة من خلال النقر بالماوس على نوع أو التحسس.أود أن أقترح تسمية المتغيرات الخاصة بك مع المعنى و السياق إذا كانت متوفرة.remoteWebServerLog, localWebServerLog ، أو حتى localWebServerLogFileInfo إذا كنت تحب اكتب في اسم.

    إذا لم يمكن تسليم أي نصيحة من العودة إلى رمز كتبته 6+ موس في وقت لاحق.سوف يكون الخدش رأسك محاولة معرفة وتعقب ما هيك كل ما تبذلونه من dbConn و fileInfo هي.ما الملف ؟ ما db ؟ الكثير من تطبيقات عدة dbs, هذا dbConn إلى OrdersDB أو ShoppingCartDB?

  • ينبغي أن تكون الطبقة تسمية وصفية أكثر.Wwould تفضل ShoppingCartItem على البند.إذا كل مربع القائمة المنسدلة إلخ اسمه جمع البنود "البند" ستكون الاصطدام مع الكثير من مساحات و ستضطر إلى القمامة الخاص بك مع رمز MyNameSpace.ShoppingCart.البند.

وبعد كل ذلك ...حتى بعد سنوات من الترميز ما زلت المسمار و لا تتبع القواعد 100% من الوقت.قد تستخدم حتى FileInfo fi = ...ولكن هذا هو السبب في أنني أحب بلدي Resharper "ريفاكتور->إعادة تسمية" الأوامر و أنا استخدامها في كثير من الأحيان.

نصائح أخرى

الاتفاقية رقم 1 يمكن أن تصبح مربكة.إذا كان لديك اثنين FileInfo الكائنات بنفس الطريقة-- يقول المصدر و الهدف-- كنت بحاجة إلى الخروج من الاتفاقية من أجل اسم اثنين.

أسماء المتغيرات يجب أن يكون ذاكري-- تشير إلى أن المراقب العادي القصد من استخدامه.

ربما كنت سأكون أسعد مع مزيج من اثنين من الاتفاقيات...مثل sourceFileInfo و targetFileInfo في هذا المثال.

من الواضح أنك لا تستطيع اسم كل نظام.سلسلة في المشروع الخاص بك سلسلة*, ولكن الأشياء التي لا تستخدم كثيرا ، esp.الأشياء التي كنت في حاجة واحدة فقط من وظيفتها في التعليمات البرمجية الخاصة بك هو واضح من اسمها, هذه الاتفاقيات تسمية مقبولة تماما.

ما يمكن القيام به على أي حال.

أود أن تذهب مع أكثر تحديدا ، مثلا ، الموقت الكائن.ما هو مؤقت ؟ ولكن أنا بالتأكيد اسم DataConnection dataConnection.

*حتى لو كان "السلسلة" لم تكن الكلمة...

أنا لا 1 في كل وقت العثور عليه جدا للقراءة.أنا على الحياد مع 2.أجد أنه من مربكة في بعض الحالات ، وذلك أساسا لأنه من الصعب أن تميز نوع من الممتلكات بسبب معرفات أن تكون متطابقة.

أنا عادة ما تتبع اتفاقية #1, على الرغم من أن الطبقة طويلة أسماء أنا أميل إلى مجرد استخدام الأحرف الأولى من الفصل.إذا أنا في اشارة الى كائن واحد أو أكثر من نفس النوع ثم أود أن قبل يعتمدون على نوع الاسم مع اسم يدل على واحد الذي هو عليه أو ما يتم استخدامه.

أنا في كثير من الأحيان استخدام الاتفاقية رقم 2 إذا كان من المنطقي.لا يوجد شيء أسوأ من وجود شيء مثل المثال الذي المدرجة العربة.ShopingCartItem ، فإن حقيقة أنه هو ملك ShoppingCart يجعل ذلك جزء من الممتلكات اسم زائدة عن الحاجة تماما.ومع ذلك أود أن المرجح جدا اسم الطبقة ShoppingCartItem و بند الممتلكات.البند جدا عامة الاسم حين ShoppingCartItem يقول لك أي نوع من البند كنت تعمل مع.

أنا متابعة الاتفاقية 1 في كل وقت.على الرغم من أنني لا تضيف إضافية تصفيات إذا كان هناك اثنين من الأشياء جنبا إلى جنب.

ولكن بعد أن قلت ذلك ، مما يجعل هذه الاتفاقية الإلزامية قد تكون إشكالية:

  1. في سياق معين cart قد يكون جيدا بما فيه الكفاية اسم ShoppingCart وجوه (إذا ، على سبيل المثال ، لا يوجد غيرها 'عربة' في نفس الوظيفة أن تكون ارتباك مع).
  2. في بعض الأحيان الاتفاقية قد غامضة تماما الغرض من أعلن الكائن.على سبيل المثال Window scoreBoard = new Window() يقول أن لدينا كائن الذي هو في الواقع نافذة ولكن يتم استخدام اللوحة.معبرة جدا.ولكن الاتفاقية التالية 1 يجب عليك أن تكتب Window window = new Window() الذي يخفي تماما القصد من وراء هذه النافذة.

لذلك أنا أقول استخدام هذه التسمية فكرة في كل مكان ما عدا عندما يعوق معنى أو تظهر بشكل غير معقول تطلبا.

حول الاتفاقية 2, وأنا أتفق تماما.الحفاظ على الممتلكات أسماء مقتضبة وترك اسم الكائن كاملة المعنى الكامل من الاحتجاج هو أنيق شيء.وهو يعمل تماما مع اسمه الكائنات.لذلك ليس هناك ما يدعو إلى تخجل من استخدامه.

أنا يكرهون بشدة فكرة وجود عدة معرفات في نطاق والتي تختلف فقط في استخدام العلوية/السفلية القضية ؛ لو كان لدي خيار ، التعليمات البرمجية التي تستخدم معرف سوف تكون هناك حاجة لاستخدام نفس تركيبة العليا/أحرف صغيرة كما إعلانها ، ولكن المدونة لا يسمح تعلن اثنين معرفات في نفس النطاق التي تختلف فقط من القضية ، أو الوصول إلى أي معرف الذي من شأنه أن ما عدا القضية المباراة معرف في داخلي نطاق.على الرغم من أن اللغة لا أعرف من (بالتأكيد ليس VB أو C#) تفرض هذه القواعد قانون مكتوب في الامتثال لهذه القواعد يمكن أن يكون بحرية المحمولة بين قضية حساسة وغير حساسة لحالة الأحرف اللغات دون الحاجة إلى إعادة تسمية معرفات.

وبالتالي لم يعجبني نمط #2.CLS الامتثال يتطلب أن أي معرفات من هذا النمط تكون مقيدة private أو internal نطاق.لأن كلا vb.net و C# تسمح الأسماء إلى بداية السطر إذا كان العقار اسمه Trait, أنا لا أرى أي سبب معروف trait أكثر _trait.استخدام اسم هذا الأخير من شأنه أن يميز بوضوح حالات عندما مبرمج أراد أن يكتب إلى دعم متغير من تلك التي إصبعه انزلق على مفتاح shift.

أما بالنسبة نمط #1 في الحالات التي يكون فيها الغرض كله من نوع أو طريقة حل واحد مغلف كائن من نوع معين ، أنا أفضل أن البادئة المجالات مع my أو مع المعلمات the.حتى في الحالات التي يكون فيها المترجم من شأنها أن تسمح نفس الأسماء المستخدمة على سبيل المثال أعضاء والمعلمات ، متميزة باستخدام البادئات يتجنب إمكانية بطريق الخطأ باستخدام واحد حيث يطلب من الآخر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top