Информация об изменениях

Сообщение Re[2]: Передача аргументов в функцию - позиционные vs именов от 19.03.2025 9:50

Изменено 19.03.2025 9:51 netch80

Re[2]: Передача аргументов в функцию - позиционные vs именованные
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Shmj, Вы писали:


S>>Какой вариант вам удобнее?

S>Если в функции — сорок параметров, из которых 38 необязательные, то именованные удобнее. Если в функции — два параметра, и оба обязательные, то удобнее позиционные.
S>Ваш К.О.

(голосом удава) А три — это куча?

Я в одном проекте нашёл три или четыре места, где у memset() перепутали длину и заполнитель, а так в C++ это параметры оба целые, никакого плача от компилятора не было.

В итоге я выдвинул правку — сделать хелпер типа

class MemsetCaller {
  void *mAddress;
  size_t mLength;
public:
  MemsetCaller(void *address, size_t length) : mAddress(address), mLength(length) {}
  void fillWith(char c) { ::memset(mAddress, c, mLength); // сам проверял по ману когда это сейчас писал
  }
};

и все вызовы перекинул на MemsetCaller(a, len).fillWith('\xA5') и в таком же духе.

Это отличный пример, где принудительно именованные аргументы точно пригодились бы.
Re[2]: Передача аргументов в функцию - позиционные vs именов
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Shmj, Вы писали:


S>>Какой вариант вам удобнее?

S>Если в функции — сорок параметров, из которых 38 необязательные, то именованные удобнее. Если в функции — два параметра, и оба обязательные, то удобнее позиционные.
S>Ваш К.О.

(голосом удава) А три — это куча?

Я в одном проекте нашёл три или четыре места, где у memset() перепутали длину и заполнитель, а так в C++ это параметры оба целые, никакого плача от компилятора не было.

В итоге я выдвинул правку — сделать хелпер типа

class MemsetCaller {
  void *mAddress;
  size_t mLength;
public:
  MemsetCaller(void *address, size_t length) : mAddress(address), mLength(length) {}
  void fillWith(char c) { ::memset(mAddress, c, mLength); // сам проверял по ману когда это сейчас писал
  }
};

и все вызовы перекинул на MemsetCaller(a, len).fillWith('\xA5') и в таком же духе.

Это отличный пример, где принудительно именованные аргументы точно пригодились бы.

UPD: Кто скажет, мол, IDE должна помочь — подставляйте лоб, метаю камень без раздумий. Полно случаев, когда IDE не справляется или вообще не может быть применена.