LINUX.ORG.RU

Как вы называете переменные и не только?

 ,


1

2

Привет

Есть ли у вас правила именования переменных и не только для следующих кейсов?

Case 1. Предположим есть некие объекты. Есть функция, которая должна что-то сделать с объектом, например вызываем её вот так: fn(obj). Как понять, аргумент функции - сам объект, указатель на объект, или индекс объекта в каком-то массиве? А как на счет массива индексов? Я понимаю, что можно посмотреть объявление obj (в тех языках, где оно есть), но если это посредине кода, то хочется как-то понять из имени: облегчило бы чтение кода. Думал про obj/iObj/pObj или obj/obj_i/obj_ptr, но может есть лучшие идеи?

Case 2. Функция-член класса. Как по имени различить локальные переменные, глобальные переменные, переменные-члены класса?

Case 3. У вас есть правила именования, которые бы по имени позволяли различать переменную, тип, класс, функциу, макрос и т. п? Я пока переменные называю с маленькой буквы, функции - с большой, макросы - все большие, а вот типы/классы пока называют TType и CClass, но у многих это вызывает отвращение. Варианты получше есть?

★★★★★
Ответ на: комментарий от XMs

глобальные переменные — зло

Очень часто вижу эту мантру из разных уст. А есть примеры фейлов с глобальными переменными?

deep-purple ★★★★★
()
Ответ на: комментарий от Nexmean

есть тулзы, которые самостоятельно генерируют документацию из исходного кода

Для плюсов подскажи. Нет не доксиген — он опирается не на код, а на комментарии к нему.

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

глобальные переменные — зло

Очень часто вижу эту мантру из разных уст. А есть примеры фейлов с глобальными переменными?

фейспалм.жпг

tailgunner ★★★★★
()
Ответ на: комментарий от mittorn

Может таки осилить поставить дрова на видеокарту? Во всяких вон икскодах по тинту понятно, локалка это, мембер или константа. А при посадке курсора на символ в правом сайдбаре выдается объявление. Весь тред живет в пещере, рассуждает об удобстве палки-копалки. Типикал си++, не?

anonymous
()
Ответ на: комментарий от Nexmean

Функции больше 50 строк тоже

Ограничивать реализацию метода кол-вом строк — спорное утверждение. Так рождаются макароны в длину. Не влезет туда, влезет сюда ))

deep-purple ★★★★★
()
Ответ на: комментарий от anonymous

Текстовое ide решило бы сразу проблему отсутствия ide на android и проблему удалённой разработки, когда код на сервере, пишется и отлаживается он прямо там.

mittorn ★★★★★
()
Ответ на: комментарий от mittorn

Не представляю себе сценарий, когда сорцы нужно держать удалённо.

RazrFalcon ★★★★★
()
Ответ на: комментарий от deep-purple

Очень часто вижу эту мантру из разных уст. А есть примеры фейлов с глобальными переменными?

Говокод целиком из side эффектов.

crutch_master ★★★★★
()
Ответ на: комментарий от mittorn

Сорян, не хочу траллировать/смеяться, но ты себя сам слышишь? Как текстовое иде (по дефолту тупо эмулируемое в графической среде) относится к удаленным кодированиям? Почему нельзя написать иде, которое по ссхфтп загрузит/выгрузит файлы и запустит конпеляцию как делает любая идеяшторм с сайтами? Чем андроид так отличается от остальных кроссплатформ, что ему нужно текстовое иде? Это как говорить, что фотошоп не подходит для создания жипегов, потому что не запущен на сервере и телефоне, куда их загружаешь.

anonymous
()
Ответ на: комментарий от crutch_master

ГорбатыйКейс чем тебе не угодил?

Этот случай еще можно терпеть, но вотТакойГорбатыйКейс - это слишком.

Набирать же удобнее, чем_через_'_'

Я не писатель, я читатель.

tailgunner ★★★★★
()
Ответ на: комментарий от RazrFalcon

Qt Coding Style.

Отличный материал! Спасибо.
Не скажу, что буду следовать на 100% но возьму за основу (хотя и так процентов 70% выполняю)

Kroz ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

> есть тулзы, которые самостоятельно генерируют документацию из исходного кода
Для плюсов подскажи. Нет не доксиген — он опирается не на код, а на комментарии к нему.

Sparx Enterprise Architect хорош. Но он платный.

Kroz ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

Желаю всем адептам венгерской нотации гореть в аду.
Адептам горбатогоКейса, в общем, тоже

Ты за подчеркивания?
Приведи свои ответы на мои вопросы в топике.

Kroz ★★★★★
() автор топика
Ответ на: комментарий от anonymous

В соответствии с официальными рекомендациями ЯП

Ты правда считаешь что-то вроде «size_t» удачным вариантом?

Kroz ★★★★★
() автор топика
Ответ на: комментарий от XMs

глобальные переменные — зло

Повсеместное оборачивание в классы, как в Java - еще большее зло.
Лучше всего реализовали в python: там каждый файл/модуль - свой namespace.

поэтому я их почти не использую

Ключевое слово «почти». Все так - почти.

Kroz ★★★★★
() автор топика
Ответ на: комментарий от Kroz

Меня вполне устраивает питоновское соглашение: ИМЯ_КОНСТАНТЫ, ИмяКласса, имя_переменной, имя_метода - имена разных сущностей визуально различаются, но еще не нужно держать в голове таблицу перекодировки (как в случае венгерской нотации). А венгерская нотация всегда была злом, а с развитием IDE стала бессмысленным злом.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от Kroz

Повсеместное оборачивание в классы, как в Java - еще большее зло.

Чем оно тебе мешает?

crutch_master ★★★★★
()
Ответ на: комментарий от deep-purple

Неосиляторство глобальных переменных

Ну да, завести себе глобальных переменных, побольше и помутабельнее, и потом героически их осиливать.

tailgunner ★★★★★
()
Ответ на: комментарий от i-rinat

Если так, то пример «из головы». Как работать с прерываниями, я уже не помню, поэтому пусть обработчиком будет абстрактный INTX()

#define PORTAFLAG 0x01
#define PORTBFLAG 0x02

static uint32_t _portAData;
static uint16_t _portBData;
static unsigned _portHaveData;

static void setFlag(unsigned flag)
  { _portHaveData |= flag; }
  
static void unsetFlag(unsigned flag)
  { _portHaveData &= ~flag; }
  
static unsigned getFlag(unsigned flag)
  { return portHaveData & flag; }



INTA()
  { _portAData = *PORTA; setFlag(PORTAFLAG);  }
  
INTB()
  { _portBData = *PORTB; setFlag(PORTBFLAG); }
  


void main()
  {
	_portHaveData = 0;

	init_device(PORTA);
	init_device(PORTB);
	
	while(1)
	  {
		if (getFlag(PORTAFLAG))
		  {…}
		if (getFlag(PORTBFLAG))
		  {…}
	  }
  }

XMs ★★★★★
()
Ответ на: комментарий от Kroz

Повсеместное оборачивание в классы, как в Java - еще большее зло

Я и не предлагаю оборачивать в классы/неймспейсы

XMs ★★★★★
()
Ответ на: комментарий от crutch_master

В таком случае фраза «глобальные переменные — зло» означает «это какое-то говно, потому, что я ниасилил».

Я хочу узнать первоисточник этой фразы и причины, по которым она появилась, а затем расползлась метастазами в суе программерского быта.

deep-purple ★★★★★
()
Ответ на: комментарий от Kroz

К счастью, на этом языке я не пишу :)

anonymous
()
Ответ на: комментарий от deep-purple

Чем хорош процедурный подход? У тебя всегда есть либо аргументы функции, либо переменные, объявленные локально. Соответственно, ты легко можешь отследить предназначение каждой переменной и не сможешь завязаться на неё оттуда, откуда не надо, не пробросив её руками. Глобальные переменные снимают это ограничение, что приводит к плохим последствиям

XMs ★★★★★
()
Ответ на: комментарий от deep-purple

И чего героического в «globalFoo->setBar()»?

Героизм заключается в запоминании, от каких глобалов зависит «FooBar()».

tailgunner ★★★★★
()
Ответ на: комментарий от i-rinat

В том, что мне доводилось видеть, Стандарт действительно был реализовал не полностью, да и Стандартная библиотека была жутко кастрированная. Это единственное, где использование глобальных переменных, на мой взгляд, оправданно, и там не такие жёсткие рамки на именование переменных. Может, поэтому с проблемами я пока и не сталкивался

XMs ★★★★★
()
Ответ на: комментарий от Unicode4all

Спасибо за ответ краткий и по делу.
На ЛОР'е такое редкость.

Kroz ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

как минимум при написании юнит-тестов

Соглашусь. Но только отчасти. Пример из другой вселенной:

Не используйте в пхп статические классы и методы. Вы не сможете их протестировать (parent::, static::, self::). Тесты пишутся на том же пхп, и ввиду его ограниченности вы не сможете получить в тестах контекст, отличный от «$this». Вы вынуждены писать реализацию с $this и создавать экземпляр класса даже тогда, когда архитектурно этого не требуется.

Тесты выше архитектуры приложения!

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

фраза «глобальные переменные — зло» означает «это какое-то говно, потому, что я ниасилил»

Toyota Senior Developer found

anonymous
()
Ответ на: комментарий от XMs

не сможешь завязаться на неё оттуда, откуда не надо

Это не похоже на защиту от кривых рук. Обезьяне ничего не стОит вынести указатель в глобал скоп и/или пробросить дополнительный аргумент в функцию.

deep-purple ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.