Чому Microsoft зробила параметри, локальні змінні та приватні поля однаковою умовою іменування?


18

Я задав це питання досить давно: Як ви називаєте свої приватні змінні в C #?

В одній з відповідей мене вказували на сторінку MSDN Microsoft, яка показує, що приватні змінні / поля повинні бути названі так:

private int myInteger;

Але параметром буде:

void SomeMethod(int myInteger)

і локальна змінна буде такою:

int myInteger;

Тож коли ви посилаєтесь на них так

myInteger = 10;

у вас немає способу знати, про кого ви говорите.

Зараз я починаю новий проект, і один з моїх колег запитує мене, чому ми не робимо щось для розмежування принаймні деяких з них.

Мені цікаво те саме. Чому стандарт Microsoft не зберіг цього?


10
Що ви маєте на увазі "у вас немає можливості знати, про кого ви говорите"? Звичайно, ви - розмах.
Томас Оуенс

2
Це керівництво здається застарілим, за замовчуванням для переосмислення (який став чимось посібником зі стилю дефакто) рекомендується префіксувати приватні поля з підкресленням, що я завжди робив завжди.

25
@kekekela: Це абсолютно не застаріло; StyleCop явно позначатиме всі випадки змінних членів, починаючи з підкреслення. Відверто кажучи, я вважаю, що підкреслення є безглуздим і дратівливим, оскільки корпус передає ту саму інформацію. Якщо вам потрібно зробити область чіткою, присвоєння префіксу за допомогою this..
Aaronaught

12
@Aaronaught Я знаходжу купу зайвого "цього". розкидані навколо мого коду безглуздими і дратівливими.

12
@kekekela: Єдине місце , де я коли - небудь знайти собі того , щоб зробити це в конструкторі, і в конструкторі це має сенс , тому що ви в буквальному сенсі проходить в значеннях , які ініціалізують поля членів ( this.component = component). Якщо ви опинилися в неоднозначних місцях в інших місцях, таких, що у вас є "купа зайвих". розкиданий навколо вашого коду ", тоді у вас погано написаний код.
Aaronaught

Відповіді:


14

У початкових конвенціях про іменування був префікс m_ для членів класу, який зводився до простого підкреслення. Ви побачите багато старих кодів C # Microsoft, використовуючи приставку підкреслення. Однак я чув у Tech Ed одного разу, що провідна підкреслення не відповідає CLS. Я припускаю, що це причина, чому вони перейшли до більш простої схеми "одне ім'я". Раніше (не впевнений зараз), що нечутливі назви VB.Net також не відповідають стандартам CLS.

Щодо того, що варто, я все ще використовую провідні підкреслення для учнів класу. Незважаючи на те, що ви можете роз'єднати цю функцію (це ім'я на відміну від імені), помилки все-таки проходять.

Вам не доведеться робити все, що вам каже MS.


1
Я думаю, ви переплутали "сумісність з CLR" з "сумісною з CLS". Якби щось було не сумісне з CLR, воно не збиралося б. CLS - це лише попередження про те, що він може бути не сумісний з іншими мовами, а в основному впливає лише на публічних членів (технічно - речі, видимі поза вашою асамблеєю).
Джоель С

@Joel - ти маєш рацію. Це питання пов'язане з ним: stackoverflow.com/questions/1195030 / ...
Дейв

2
Я все ще використовую префікс "m_" ...
CesarGon

4
+1 ", оскільки вам не доведеться робити все, що вам каже MS". Подумайте самі!
gbjbaanb

1
Це не лише сумісність з CLS, якщо поле є protected, ніprivate
Рейчел

9

localі parameterзмінні називаються однаково, тому що їх сфера застосування однакова

Щодо приватних змінних, то щодо цього існують різні думки. Я завжди використовував знайдені тут стандарти , в яких вказано використовувати передові _перед приватними змінними, хоча автор справді говорить, що _це трохи суперечливо і що Microsoft рекомендує проти цього.

У Вікіпедії зазначено, що в C і C ++

Імена, що починаються з подвійного підкреслення або підкреслення та великої літери, зарезервовані для реалізації (компілятор, стандартна бібліотека) і не повинні використовуватися (наприклад, __зарезервовано або _Зарезервовано).

тому, можливо, це було причиною того, що Microsoft рекомендувала проти цього, хоча досить добре відомо, що багато розробників Microsoft все одно використовують _префікс для своїх приватних змінних.


2
Приємна точка щодо параметра та локальних змінних, що мають однакову область застосування (+1). Ніхто більше цього не згадував. Наслідком є ​​те, що якщо вам потрібна локальна змінна з тим самим назвою параметра, ви можете просто скористатися параметром. Особисто я вважаю підкреслення некрасивим і неточним. Тоді як thisнапевно посилається на поточний об'єкт. Я не розумію ненависті до this. Це тому, що це неправильно зрозуміло?
Jason S

4

Я не можу вам точно сказати, чому вони не тримали їх іншими. Ймовірно, ніхто не може, якщо хтось, хто брав участь у створенні стандартів, не побачить цього питання.

Багато людей створюють свої власні угоди, випереджаючи змінні екземпляра з _або m_, але я дійсно не думаю , що це має значення. Ви можете зробити багато чого з контексту, і IDE в наші дні досить розумні, щоб допомогти вам. Наприклад, Visual Studio з додатком ReSharper покаже вам локальні та екземпляри змінних у різних кольорах.

Якщо вам дійсно важливо, що ви розмежовуєте між двома областями, ви можете використовувати this.префікс для позначення змінної екземпляра:

public class Test
{
    private int myInteger;

    void SomeMethod(int myInteger)
    {
        this.myInteger = 10; // sets instance variable to 10
        myInteger = 10; // does not affect the instance variable.
    }
}

Без будь-яких інших плагінів Visual Studio за замовчуванням допоможе вам з Intellisense:

скріншот

(Спливаюче вікно все ще може бути стильоване ReSharper там, але ReSharper нічого не додає до функцій вбудованого Intellisense, тому, хоча запас може виглядати трохи інакше, він все одно матиме обидва варіанти. )

Ви також можете використовувати інструменти аналізу коду, такі як FxCop та StyleCop, щоб допомогти вам знайти потенційні проблеми із змінними іменами та областями.


Щоб детальніше зупинитися на роботі this, я завжди віддаю перевагу this, тому що це, безумовно, стосується поточного екземпляра, в якому будинку ви знаходитесь, тому це точно. Умови підкреслення або підкреслення m - це лише те - умови, які можуть або не можуть посилатися на змінні екземпляри, і вони стають зайвими this. Єдине місце, яке я вважаю підкресленням корисним, - це нечутливі до регістру VB для розрізнення назв об'єктів та класів. Але це зовсім інша історія.
Jason S

4

Чому стандарт Microsoft не зберіг цього?

Люди в Microsoft написали книгу під назвою Framework Design Guidelines, в якій пояснили низку конвенцій, зокрема, чому деякі речі були викладені верблюдом , а інші - паскалом .

Редагування (додавання деталей із книги):

У книзі вони згадують про дослідження юзабіліті, а також деякі уроки, здобуті з придбання групи Turbo Pascal. Крім того, хоча не всі мови залежать від регістру (наприклад, VB), інші є (наприклад, C #), тому одна повинна бути послідовною у назві. Не можна залежати від різниць, якщо тільки окремі предмети розмежувати. Якщо один дотримуватись умов, які використовуються в решті рамок, це призведе до меншої плутанини з боку розробників.

Глава 3, Назви рекомендацій.
Розділ 3.1 - конвенції про капіталізацію.

camelCasingпризначений для імен параметрів.
PascalCasingпризначений для простору імен, типів та імен учасників. Якщо частина імені є двобуквенними абревіатурами, зберігайте їх з великої літери разом, наприклад IOStream.

Розділ 3.5 стосується іменування класів, структур та інтерфейсів.
Розділ 3.6 стосується іменування членів типу.
Розділ 3.7 охоплює параметри іменування.


4
Чи хотіли б ви підвести підсумки для тих, хто не володіє книгою?
Крамій

Я згоден з Крамієм. Резюме було б чудово!
Ваккано

@Kramil, Vaccano, Схоже, мені доведеться ще раз перевірити його з бібліотеки. Як правило, я роблю це лише тоді, коли починаю нову роботу і обговорюю перехід до стандартів іменування та кодування.
Tangurena

1
lol, так що "Не можна залежати від різниць, якщо виокремлюєте окремі предмети", далі йдеться про використання camelCase або PascalCase для диференціації предметів.
gbjbaanb

1

Тому що вони досить помітні, оскільки залежать від контексту, в якому вони написані.

Наприклад, чи використовували ви коли-небудь параметр як змінну члена? Або локальна змінна як параметр? Як щодо змінної члена як локальної?

  • Всі змінні учасника знаходяться в "тілі" класу. Я дійсно не купую аргумент про те, що вам потрібно встановити префікс члена, коли ви можете thisйого відрізнити від локальної змінної з подібною назвою, інакше він не потрібен.

  • Локальна змінна також визначається лише в межах методу або в області блоку коду.

  • Параметр завжди визначається в підписі методу.

Якщо ви переплутали або змішали всі ці типи змінних, то вам дійсно слід більше думати про свій дизайн коду, щоб зробити його більш читабельним або зрозумілим. Дайте їм кращі та більш описові назви, ніж myInteger.


0

Я не можу відповісти на ваше запитання щодо стандартів Microsoft. Якщо ви хочете стандартні розрізняти ці речі, стандартне використання I параметрів PL / SQL є префікс імені параметра з in_, out_, io_, для входів, амбулаторних, так і в-out- параметрів. Змінні, локальні для функції, мають префікс a v_.


0

Більшість компаній, яких я знаю, мають стандарти кодування, які визначають або підкреслення, або малу літеру m (для "члена" я припускаю) як префікс змінних своїх членів.

Так

_varName

або

mVarName


2
Так, але MS застаріле використання m для членів, до чого потрапляє ОП.
Крістофер Біббс

"Більшість компаній" не включає Microsoft, що стосується цієї компанії.
Aaronaught

1
Я не усвідомлював, що Micrsoft MSDN призначений для внутрішніх стандартів кодування в Microsoft.
JeffO


0

Подібно до того, як вказували інші люди, зазвичай ви можете сказати, за якою сферою застосування використовується предмет. Насправді ви не можете мати параметр і локальну змінну в тій самій області, і якщо ви хочете приватну змінну, просто використовуйте this.myInteger. Тому я не думаю, що Microsoft надто переживає з цього приводу, тому що ви можете легко розмежувати їх, якщо хочете.

Але, маючи на увазі, я трохи здивований, що ніхто ще цього не сказав, але забудьте про Microsoft та їхні умови домену імен (ну хтось, можливо, сказав це вже зараз, як мені довелося бігти на зустріч і залишив це відкритим, не подаючи заявку це). Угорська нотація також була конвенцією про іменування, розпочатою в Microsoft (чи це Xerox? Я ніколи не пам'ятаю, коли Симоній придумав це). Я не можу придумати когось, кого я знаю, що не проклинає назву угорської нотації донині. Ми стали настільки роздратовані цим на місці, що я працював, що ми придумали власний стандарт, який ми використовували внутрішньо. Для нас було більше сенсу і трохи пришвидшити нашу роботу (це було насправді досить близько до того, що пропонує Microsoft зараз, але все було паскальним випадком, за винятком приватних змінних).

Незважаючи на це, новіший стандарт, який використовує Microsoft (суміш футляра з верблюдом та паскаль), не надто поганий. Але якщо вам та вашим колегам це не подобається, придумайте власний набір стандартів (найкраще колективно). Звичайно, це залежить від того, чи має ваша компанія вже встановлений набір стандартів. Якщо вони роблять, дотримуйтесь їх. Інакше придумайте, що працює для вас та ваших колег. Просто тримайте це логічно.

Оскільки Aaronaught попросив посилання на Чарльза Симоні та угорську нотацію: http://en.wikipedia.org/wiki/Charles_Simini

http://en.wikipedia.org/wiki/Хунгарська_нотація

http://msdn.microsoft.com/en-us/library/aa260976(v=VS.60).aspx

http://ootips.org/hungarian-notation.html

http://www.hitmill.com/programming/vb/Hungarian.html

http://web.mst.edu/~cpp/common/hungarian.html

Останні два - лише приклади угорської нотації, а посилання ootips - це лише деякі цитати, що стосуються деяких думок з цього приводу. Зауважте, що існує також система Угорська нотація, але це також, наскільки я знаю, набуло популярності у програмістів Microsoft (хоча, на відміну від Simonyi для варіацій програм, я не знаю, у кого).


1
1) Угорська не була винайдена корпорацією Майкрософт, і 2) "угорська", яку ви посилаєтесь, - це тип угорська, а не семантична угорська.
Aaronaught

Я ніколи не казав, що Microsoft придумала це. Я фактично сказав, що Чарльз Симоні придумав це (зокрема, угорська нотація додатків). Microsoft сильно штовхнув його, але я ніколи не говорив, що вони створили його (насправді я сказав, що не знаю, чи створив він його протягом своїх днів Xerox або Microsoft). Я наводив це як приклад того, що велика компанія (Microsoft) запропонувала як спосіб робити. Моя думка у всьому цьому - це те, що ОП не повинно хвилюватися щодо називання конвенцій, про які компанія, на яку він не працює, каже, що це "правильний шлях" (якщо він не працює для Microsoft, і в цьому випадку він повинен піклуватися).
JaCraig

[потрібна цитата]
Aaronaught

1
Гм так, нам не потрібно було цитування того, що таке угорська нотація. [Цитування необхідне] - це всі сумнівні твердження у вашій відповіді.
Aaronaught
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.