Використання "цього" в Голангу


12

Найближче до Golang - це посібник зі стилів, знайдений тут , під іменами отримувача написано:

Назва приймача методу має бути відображенням його ідентичності; часто достатньо одного або двох буквених скорочень такого типу (наприклад, "c" або "cl" для "Клієнта"). Не використовуйте загальні імена, такі як "я", "це" або "само", ідентифікатори, характерні для об'єктно-орієнтованих мов, які надають більше уваги методам на відміну від функцій. Ім'я не повинно бути настільки описовим, як аргумент методу, оскільки його роль очевидна і не має жодної документальної мети.

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

Якщо ім’я не повинно бути описовим, його роль очевидна, і воно не має жодної документальної мети , навіщо б використання "цього" нахмуритись?


3
Подібне запитання з додатковими відповідями: stackoverflow.com/questions/23482068
Трентон

Відповіді:


11

Треба було б попросити автора цього посібника зі стилю знати напевно, але я думаю, що головна причина, з якою я з ним погоджуюсь, полягає в тому, що зв’язок між структурою та методом набагато слабкіший на Go, ніж інші мови .

По суті, коли ви пишете такий метод:

func (m *MultiShape) area() float64 {
  ...
}

Це майже те саме, що писати подібну функцію:

func area(m *MultiShape) float64 {
  ...
}

Єдина відмінність - це незначна зміна синтаксису в тому, як ми називаємо функцію / метод.

В інших мовах this/ self/ будь-яка змінна, як правило, має деякі особливі властивості, такі як магічне забезпечення мовою або спеціальний доступ до приватних методів (пам'ятайте, що Go не має приватних полів / методів). Хоча "приймач" певною мірою все ще надається "магічним", він настільки схожий на аргумент звичайної функції, що він, напевно, не рахується.

Плюс до того, що в "традиційних" мовах OOP всі структури / клас "приходять з визначенням struct / class, так що більше не можна додавати ззовні. На Go, наскільки я знаю, хтось може додати більше методів до чого завгодно (звичайно, в межах власного коду).

Я не написав достатньо Перейти, щоб створити власний посібник зі стилів, але особисто я, мабуть, використовував би thisметоди, визначені в тому самому файлі, як структура, яку вони отримують, та ще якесь описове ім'я приймача для методів, які я додаю до структур з інших файлів .


Це хороше пояснення, я вважаю, що я звик до C # та інших мов OOP, тому я повертаюся до конвенцій, які я знаю.
Адам

1
@Адам я б уникну, thisякби не з якоїсь іншої причини, як нагадати собі, що я не є традиційною мовою ООП.
Майкл Хемптон

4
Немає реальної різниці між "цим" і "приймачем" (і, будь ласка, перестаньте зловживати словом "магія" - кожну особливість мови програмування високого рівня можна назвати "магічною", це не робить це нічого негативним, ваша спроба вибирати "це" за те, що "магія" не має сенсу).
mvmn

6

Мене не переконує цей посібник зі стилів, і я не думаю, що нічого кращого this, meабо self. Тому що this, meабо selfце ясно зрозуміло, що змінна є екземпляром структури контексту. Я не кажу, що змінна назва назви структури з нижньою обробкою - це погана ідея, мені просто подобається спосіб, який thisробить це зрозумілим.


без пояснення ця відповідь може стати марною у випадку, якщо хтось інший висловить протилежну думку. Наприклад, якщо хто - то розмістив вимога , як «Я переконаний , що в цьому посібнику стиль , і я думаю , що це краще , ніж this, meабо self" , як би ця відповідь допоможе читачеві вибрати з двох протилежних думок? Подумайте про те, щоб відредагувати її в кращій формі, щоб відповісти керівництву як відповісти
gnat

Я думаю, що я чітко пояснив, що хотів сказати.
Qian Chen

1
Я згоден. Я думаю, що занадто багато мозку отруєне контекстом javascript. Якщо відкласти це вбік Те, що це стосується поточного контексту, набагато простіше. І простіше, якщо ви будете перейменовувати структури згодом або скопіювати вставити частину програми. Гонг для коротких криптовалютних імен, рядок hl тощо, не робить його легшим за це.
Сентимент

0

Це з точки зору JavaScript, де thisє фактичне значення ключового слова для компілятора, але, з мого розуміння, якщо вони нормальні з двобуквенними абревіатурами для типу об’єкта, це слід використовувати досить просто. Причина різниці полягає в тому, що в пристойно великому блоці прогресивно глибшого асинхронного коду може бути дуже просто неправильно трактувати, що "це" або приймач знаходиться в більш глибокому контексті; і можливо, це буде не той самий об’єкт.

Наприклад, у JavaScript модуль управління може запустити діалогове вікно та оголосити onLoadфункцію, вбудовану в нього. Але в цей момент іншому кодеру може бути дуже просто неправильно інтерпретувати thisвсередині onLoadпосилання на модуль управління, а не на діалог; або навпаки. Цього можна уникнути, якби керування називалося ctrlі діалоговим вікном як dg.


3
Я не прихильник, але більшість заплутаної поведінки thisв Javascript просто не стосується Go, тому я здогадуюсь, що саме тому.
Іксрек

@Ixrec Гм ... гаразд. Я наче намагався поширити це на ситуації, коли можна було вибрати thisім'я; наприклад, часто JS-кодери пишуть, var self = thisщоб зберегти ту саму посилання; але, згідно з керівництвом проекту Go, це може мати ті самі проблеми з плутаниною, і теоретично слід використовувати більш описові посилання.
Katana314
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.