Re: [EXTERNAL] Re: Allow declaration after statement and reformat code to use it

Поиск
Список
Период
Сортировка
От Ranier Vilela
Тема Re: [EXTERNAL] Re: Allow declaration after statement and reformat code to use it
Дата
Msg-id CAEudQAqAQ_yefg8mz31m4dhgi8pkETq-Tk2AzzTQ_H5F_b=tWg@mail.gmail.com
обсуждение исходный текст
Ответ на Re: [EXTERNAL] Re: Allow declaration after statement and reformat code to use it  (Andrew Dunstan <andrew@dunslane.net>)
Список pgsql-hackers
Em sáb., 21 de ago. de 2021 às 12:02, Andrew Dunstan <andrew@dunslane.net> escreveu:

On 8/20/21 12:30 PM, Ranier Vilela wrote:
>
>
> There is a reason why GMs Brian Kernighan and Dennis Ritchie made the
> C89, less buggy.
> IMHO C99 makes it easy to make more mistakes.
> One more step and we won't even need to declare a variable.
>
>

I've used both styles in different languages over the years. I don't
know that one is a clearly better way, notwithstanding what various
theorists might say.
IMO declarations first is better, without a shadow of a doubt.
Maybe because my mind is vision.
Seeing the complete view, I can look for bugs and find some way to improve performance.
It's one of the reasons for having small, well-defined functions.
Of course, with extra reward, you can and should reduce the scope.
In this case the compiler does a better job and generates more optimized code.

XLogRecPtr
XLogInsertRecord(XLogRecData *rdata,
                              XLogRecPtr fpw_lsn,
                              uint8 flags,
                              int num_fpi)
{
           XLogCtlInsert *Insert = &XLogCtl->Insert;                   /* What is the purpose of this variable */
           XLogRecord *rechdr = (XLogRecord *) rdata->data;  /* What is the purpose of this variable */
           XLogRecPtr StartPos;                                                 /* What is the purpose of this variable */
           XLogRecPtr EndPos;                                                  /* What is the purpose of this variable */
           pg_crc32c rdata_crc;                                                 /* What is the purpose of this variable */
           uint8 info = rechdr->xl_info & ~XLR_INFO_MASK;
           bool isLogSwitch = (rechdr->xl_rmid == RM_XLOG_ID && info == XLOG_SWITCH);
           bool prevDoPageWrites = doPageWrites;
           bool inserted;

           /* we assume that all of the record header is in the first chunk */
          Assert(rdata->len >= SizeOfXLogRecord);

          /* cross-check on whether we should be here or not */
         if (!XLogInsertAllowed())
             elog(ERROR, "cannot make new WAL entries during recovery");

All declarations organized by type and use, almost a structure.
No need to find or think, just see.
We can immediately connect variable info with isLogSwitch.


Note that in C89 it's fantastically easy to put the declaration as close
as you like to the first use of a variable. All it takes is a pair of
braces enclosing the variable scope.
IMO is an exception, which does not follow the C89 pattern.
It's a valid last resource, of course, but not as good practice.


Even if we were to relax our rules on this, making wholesale changes
along these lines and even more backpatching them seem out of the question.
It would be a nightmare.

regards,
Ranier Vilela

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Andrew Dunstan
Дата:
Сообщение: Re: [EXTERNAL] Re: Allow declaration after statement and reformat code to use it
Следующее
От: "Bossart, Nathan"
Дата:
Сообщение: Re: .ready and .done files considered harmful