technicalsuwako.moe/gemini/blog/programming-pyramid-of-doom...

115 行
3.5 KiB
Plaintext
Raw Blame 履歴

このファイルには曖昧(ambiguous)なUnicode文字が含まれています

このファイルには、他の文字と見間違える可能性があるUnicode文字が含まれています。 それが意図的なものと考えられる場合は、この警告を無視して構いません。 それらの文字を表示するにはエスケープボタンを使用します。

=> /blog.gmi ブログ一覧へ
#【プログラミング】アドバイス1:運命のピラミッドを回避
投稿日2023-12-05
プログラミングしたら、気づかずに運命のピラミッドを作る可能性が非常に高いです。
これを回避した方が良いと思います。
## 運命のピラミッドとは?
ブログラミングで、運命のピラミッドとは、ネストされたインデントの多くのレベルを使用し、コードが読みにくくなる事です。
例えば、下記のC言語のコードは運命のピラミッドの問題は発生します。
```c
int main(int argc, char **argv) {
if (argc >= 2) {
Display *d = XOpenDisplay(NULL);
if (d != NULL) {
int src = DefaultScreen(d);
Window w = XCreateSimpleWindow(d, RootWindow(d, scr), 0, 0, 500, 500, 1, BlackPixel(d, scr), WhitePixel(d, scr));
XSelectInput(d, w, ExposureMask | KeyPressMask);
XMapWindow(d, w);
XFlush(d);
GC gc = XCreateGC(d, w, 0, NULL);
if (gc != NULL) {
XImage *ximg = openimg(d, argv[1]):
if (ximg != NULL) {
// などなど
}
} else {
fprintf(stderr, "グラフィックス内容を創作に失敗しました。\n");
}
} else {
fprintf(stderr, "画像を開けられません。\n");
}
} else {
printf("使用方法: %s <画像ファイル>\n", argv[0]);
}
return 0;
}
```
変わりに、下記のコードを書いた方が良いです。
```c
int main(int argc, char **argv) {
if (argc < 2) { // argcはつ以下の場合、続行する意味はありません。
printf("使用方法: %s <画像ファイル>\n", argv[0]);
return 1;
}
Display *d = XOpenDisplay(NULL);
if (d == NULL) { // 同様に、DisplayがNULLの場合、続行する意味はありません。
fprintf(stderr, "画像を開けられません。\n");
return -1;
}
int src = DefaultScreen(d);
Window w = XCreateSimpleWindow(d, RootWindow(d, scr), 0, 0, 500, 500, 1, BlackPixel(d, scr), WhitePixel(d, scr));
XSelectInput(d, w, ExposureMask | KeyPressMask);
XMapWindow(d, w);
XFlush(d);
GC gc = XCreateGC(d, w, 0, NULL);
if (gc == NULL) { // 同じパターン
fprintf(stderr, "グラフィックス内容を創作に失敗しました。\n");
return -1;
}
XImage *ximg = openimg(d, argv[1]):
if (ximg == NULL) { // また、同じパターン
fprintf(stderr, "画像を開けられません: %s\n", argv[1]);
XFreeGC(d, gc);
XCloseDisplay(d);
return -1;
}
// などなど
return 0;
}
```
=> https://gitler.moe/suwako/mivfx/src/branch/master/main.c 実際、C言語の開発者は運命のピラミッドを作る事は珍しいです。
この問題は主にWeb開発で多く起こります。
=> https://gitler.moe/tak4/bibis/src/branch/master/data-post.php ですから、PHPの例えはご覧下さい。
```php
$thread_title = '';
if ($thread_id > '') {
$thread_title = load_post_title_by_id($thread_id);
if (!$thread_title > '') {
$thread_title = '無題#' . mb_substr($thread_id, 0, 7);
}
}
```
少しだけ変わります。
```php
$thread_title = '';
if ($thread_id != '') { // 文字列で「>」を使用すると、バグが発生する可能性があります。
$thread_title = load_post_title_by_id($thread_id);
}
if ($thread_title != '') { // !$thread_title > '' はかなりおかしいので、これも修正しました。
$thread_title = '無題#' . mb_substr($thread_id, 0, 7);
}
```
以上