【プログラミング】アドバイス1:運命のピラミッドを回避

このコミットが含まれているのは:
守矢諏訪子 2023-12-10 22:56:07 +09:00
コミット 16529c4769
5個のファイルの変更352行の追加41行の削除

ファイルの表示

@ -3,13 +3,134 @@
<id>gemini://technicalsuwako.moe</id>
<title>テクニカル諏訪子</title>
<updated>2023-12-01T13:30:00Z</updated>
<updated>2023-12-05T00:00:00Z</updated>
<author><name>テクニカル諏訪子</name></author>
<link href="gemini://technicalsuwako.moe" rel="alternate"></link>
<entry>
<id>blog/programming-pyramid-of-doom.gmi</id>
<author><name>凛</name></author>
<title type="html">【プログラミング】アドバイス1:運命のピラミッドを回避</title>
<published>2023-12-05T00:00:00Z</published>
<category term="jp"></category>
<category term="blog"></category>
<category term="システム開発"></category>
<category term="php"></category>
<category term="c言語"></category>
<category term="プログラミング"></category>
<category term="ウエブ開発"></category>
<link href="gemini://technicalsuwako.moe/blog/programming-pyramid-of-doom.gmi" rel="alternate"></link>
<content type="html">
&lt;p&gt;プログラミングしたら、気づかずに運命のピラミッドを作る可能性が非常に高いです。&lt;br /&gt;
これを回避した方が良いと思います。&lt;/p&gt;
&lt;h2 id=&#34;heading&#34;&gt;運命のピラミッドとは?&lt;/h2&gt;
&lt;p&gt;ブログラミングで、運命のピラミッドとは、ネストされたインデントの多くのレベルを使用し、コードが読みにくくなる事です。&lt;br /&gt;
例えば、下記のC言語のコードは運命のピラミッドの問題は発生します。&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;&lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#00a000&#34;&gt;main&lt;/span&gt;(&lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;int&lt;/span&gt; argc, &lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;**&lt;/span&gt;argv) {
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (argc &lt;span style=&#34;color:#666&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;2&lt;/span&gt;) {
Display &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt;d &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; XOpenDisplay(&lt;span style=&#34;color:#a2f&#34;&gt;NULL&lt;/span&gt;);
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (d &lt;span style=&#34;color:#666&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;NULL&lt;/span&gt;) {
&lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;int&lt;/span&gt; src &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; DefaultScreen(d);
Window w &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; XCreateSimpleWindow(d, RootWindow(d, scr), &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#666&#34;&gt;500&lt;/span&gt;, &lt;span style=&#34;color:#666&#34;&gt;500&lt;/span&gt;, &lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;, BlackPixel(d, scr), WhitePixel(d, scr));
XSelectInput(d, w, ExposureMask &lt;span style=&#34;color:#666&#34;&gt;|&lt;/span&gt; KeyPressMask);
XMapWindow(d, w);
XFlush(d);
GC gc &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; XCreateGC(d, w, &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#a2f&#34;&gt;NULL&lt;/span&gt;);
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (gc &lt;span style=&#34;color:#666&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;NULL&lt;/span&gt;) {
XImage &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt;ximg &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; openimg(d, argv[&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;])&lt;span style=&#34;color:#666&#34;&gt;:&lt;/span&gt;
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (ximg &lt;span style=&#34;color:#666&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;NULL&lt;/span&gt;) {
&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// などなど
&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt; }
} &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;else&lt;/span&gt; {
fprintf(stderr, &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;グラフィックス内容を創作に失敗しました。&lt;/span&gt;&lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt;);
}
} &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;else&lt;/span&gt; {
fprintf(stderr, &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;画像を開けられません。&lt;/span&gt;&lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt;);
}
} &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;else&lt;/span&gt; {
printf(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;使用方法: %s &amp;lt;画像ファイル&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt;, argv[&lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;]);
}
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;変わりに、下記のコードを書いた方が良いです。&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;&lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#00a000&#34;&gt;main&lt;/span&gt;(&lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;int&lt;/span&gt; argc, &lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;**&lt;/span&gt;argv) {
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (argc &lt;span style=&#34;color:#666&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;2&lt;/span&gt;) { &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// argcはつ以下の場合、続行する意味はありません。
&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt; printf(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;使用方法: %s &amp;lt;画像ファイル&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt;, argv[&lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;]);
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;;
}
Display &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt;d &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; XOpenDisplay(&lt;span style=&#34;color:#a2f&#34;&gt;NULL&lt;/span&gt;);
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (d &lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;NULL&lt;/span&gt;) { &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// 同様に、DisplayがNULLの場合、続行する意味はありません。
&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt; fprintf(stderr, &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;画像を開けられません。&lt;/span&gt;&lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;;
}
&lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;int&lt;/span&gt; src &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; DefaultScreen(d);
Window w &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; XCreateSimpleWindow(d, RootWindow(d, scr), &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#666&#34;&gt;500&lt;/span&gt;, &lt;span style=&#34;color:#666&#34;&gt;500&lt;/span&gt;, &lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;, BlackPixel(d, scr), WhitePixel(d, scr));
XSelectInput(d, w, ExposureMask &lt;span style=&#34;color:#666&#34;&gt;|&lt;/span&gt; KeyPressMask);
XMapWindow(d, w);
XFlush(d);
GC gc &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; XCreateGC(d, w, &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#a2f&#34;&gt;NULL&lt;/span&gt;);
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (gc &lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;NULL&lt;/span&gt;) { &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// 同じパターン
&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt; fprintf(stderr, &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;グラフィックス内容を創作に失敗しました。&lt;/span&gt;&lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;;
}
XImage &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt;ximg &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; openimg(d, argv[&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;])&lt;span style=&#34;color:#666&#34;&gt;:&lt;/span&gt;
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (ximg &lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;NULL&lt;/span&gt;) { &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// また、同じパターン
&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt; fprintf(stderr, &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;画像を開けられません: %s&lt;/span&gt;&lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt;, argv[&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;]);
XFreeGC(d, gc);
XCloseDisplay(d);
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;;
}
&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// などなど
&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href=&#34;https://gitler.moe/suwako/mivfx/src/branch/master/main.c&#34;&gt;実際、C言語の開発者は運命のピラミッドを作る事は珍しいです。&lt;/a&gt;&lt;br /&gt;
この問題は主にWeb開発で多く起こります。&lt;br /&gt;
&lt;a href=&#34;https://gitler.moe/tak4/bibis/src/branch/master/data-post.php&#34;&gt;ですから、PHPの例えはご覧下さい。&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$thread_title&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;;
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;$thread_id&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;) {
&lt;span style=&#34;color:#b8860b&#34;&gt;$thread_title&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; load_post_title_by_id(&lt;span style=&#34;color:#b8860b&#34;&gt;$thread_id&lt;/span&gt;);
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#666&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;$thread_title&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;) {
&lt;span style=&#34;color:#b8860b&#34;&gt;$thread_title&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;無題#&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt; mb_substr(&lt;span style=&#34;color:#b8860b&#34;&gt;$thread_id&lt;/span&gt;, &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#666&#34;&gt;7&lt;/span&gt;);
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;少しだけ変わります。&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$thread_title&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;;
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;$threadid&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;) { &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// 文字列で「&amp;gt;」を使用すると、バグが発生する可能性があります。
&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$thread_title&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; load_post_title_by_id(&lt;span style=&#34;color:#b8860b&#34;&gt;$threadid&lt;/span&gt;);
}
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;$thread_title&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;) { &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// !$thread_title &amp;gt; &amp;#39;&amp;#39; はかなりおかしいので、これも修正しました。
&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$thread_title&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;無題#&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt; mb_substr(&lt;span style=&#34;color:#b8860b&#34;&gt;$threadid&lt;/span&gt;, &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#666&#34;&gt;7&lt;/span&gt;);
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;以上&lt;/p&gt;
</content>
</entry>
<entry>
<id>blog/sp-112.gmi</id>
<author><name>凛</name></author>
@ -154,45 +275,5 @@
</content>
</entry>
<entry>
<id>blog/spliti-210.gmi</id>
<author><name>凛</name></author>
<title type="html">【】spliti 2.1.0登場</title>
<published>2023-11-15T00:00:00Z</published>
<category term="jp"></category>
<category term="blog"></category>
<category term="ウエブ開発"></category>
<category term=""></category>
<category term="spliti"></category>
<link href="gemini://technicalsuwako.moe/blog/spliti-210.gmi" rel="alternate"></link>
<content type="html">
&lt;h2 id=&#34;spliti&#34;&gt;splitiって何?&lt;/h2&gt;
&lt;p&gt;splitiはMixiのフェイクニュース部分向けプライバシーUIです。&lt;/p&gt;
&lt;h2 id=&#34;heading&#34;&gt;変更&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;出版社ページを追加&lt;/li&gt;
&lt;li&gt;出版社ページのページネーション&lt;/li&gt;
&lt;li&gt;カテゴリーのページネーション&lt;/li&gt;
&lt;li&gt;つぶやきを見るページ(list_quote.pl)を追加&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;heading-1&#34;&gt;ソースコード&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://gitler.moe/suwako/spliti&#34;&gt;Gitler&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;heading-2&#34;&gt;公式インスタンス&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;&#34;&gt;https://mixi.076.moe/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以上&lt;/p&gt;
</content>
</entry>
</feed>

ファイルの表示

@ -2,6 +2,7 @@
# 記事一覧
=> /blog/programming-pyramid-of-doom.gmi 2023年12月05日 【プログラミング】アドバイス1:運命のピラミッドを回避
=> /blog/sp-112.gmi 2023年12月01日 【】sp 1.1.2登場
=> /blog/sp-111.gmi 2023年12月01日 【】sp 1.1.1登場
=> /blog/sp-110.gmi 2023年12月01日 【】sp 1.1.0登場

114
gemini/blog/programming-pyramid-of-doom.gmi ノーマルファイル
ファイルの表示

@ -0,0 +1,114 @@
=> /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);
}
```
以上

ファイルの表示

@ -3,6 +3,7 @@
# avatar = gemini://076.moe/static/suwako.jpg
# description = テクニカル諏訪子様のtwtxtフィード
# link = ホームページ gemini://technicalsuwako.moe
2023-12-05T00:00:00Z09:00 【プログラミング】アドバイス1:運命のピラミッドを回避 - gemini://technicalsuwako.moe/blog/blog/programming-pyramid-of-doom.gmi
2023-12-01T13:30:00Z09:00 【】sp 1.1.2登場 - gemini://technicalsuwako.moe/blog/blog/sp-112.gmi
2023-12-01T13:00:00Z09:00 【】sp 1.1.1登場 - gemini://technicalsuwako.moe/blog/blog/sp-111.gmi
2023-12-01T00:00:00Z09:00 【】sp 1.1.0登場 - gemini://technicalsuwako.moe/blog/blog/sp-110.gmi

114
src/blog/programming-pyramid-of-doom/index.md ノーマルファイル
ファイルの表示

@ -0,0 +1,114 @@
title: 【プログラミング】アドバイス1:運命のピラミッドを回避
author: 凛
date: 2023-12-05
tags: jp,blog,システム開発,php,c言語,プログラミング,ウエブ開発
----
プログラミングしたら、気づかずに運命のピラミッドを作る可能性が非常に高いです。\
これを回避した方が良いと思います。
## 運命のピラミッドとは?
ブログラミングで、運命のピラミッドとは、ネストされたインデントの多くのレベルを使用し、コードが読みにくくなる事です。\
例えば、下記の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;
}
```
[実際、C言語の開発者は運命のピラミッドを作る事は珍しいです。](https://gitler.moe/suwako/mivfx/src/branch/master/main.c)\
この問題は主にWeb開発で多く起こります。\
[ですから、PHPの例えはご覧下さい。](https://gitler.moe/tak4/bibis/src/branch/master/data-post.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 ($threadid != '') { // 文字列で「>」を使用すると、バグが発生する可能性があります。
$thread_title = load_post_title_by_id($threadid);
}
if ($thread_title != '') { // !$thread_title > '' はかなりおかしいので、これも修正しました。
$thread_title = '無題#' . mb_substr($threadid, 0, 7);
}
```
以上