コミュニティアイコン プチコン 非公式コミュニティ トピック

アバター
アオタク ◆6Tx4tgOERFcr
2019/8/19 4:56
質問
改めての質問
「ELSEIF」と「ELSE IF」はどう使い分けるべきでしょうか?

コメント

アバター
高原のな 2019/8/19 6:09 ◆bY8RViwvoODw
IF〜ELSE〜ENDIFとか、FOR〜NEXTとかWHILE〜WEND、DEF〜ENDなど、「始まり」と「終わり」(加えて一部では「間」)の命令文がセットになっていてそのセットの部分で囲まれた部分をブロックと呼んでいます。(私は、始まりの命令の名前をとって「〜〜ブロック」と呼んでいます。IFブロックとかFORブロックとか。以下この回答文中はこの規則)(なお、もっといいブロックの説明のやり方があると思います)
また、ブロックの囲まれた間の部分はインデント(字下げ)してブロックの区間を視覚的に見やすくしておくと良いです。

「ELSEIF」と「ELSE IF」はそのブロックのでき方に違いがあります
「ELSEIF」の場合は、「IF〜ELSEIF〜ELSE〜ENDIF」というふうにブロックは一重で、ELSEIFブロックができるのみですが、
「ELSE IF」の場合は、「IF〜ELSE ( IF〜ELSE〜ENDIF ) 〜 ENDIF」とブロックが二重になります。外側のELSEブロックの中に新しくIFのブロックができているというイメージです。「ELSE IF」は二つのブロックを作る命令でできているのでこのようになります。

使い分け方は個々人でやり方があると思いますし、私はこれといった使い分け方を持っていないのですが、やはり条件文や分岐後の処理の様子を見て時と場合に応じた使い分けができると良いと思います。
例えば、ブロックが増えて何重にもなってしまってENDIFがややこしいことになりそうなので基本的にELSEIFで書くということにしておいて、そこでIFやELSEIFでまだ処理していないパターンについて処理するとき、後処理が共通だが、その共通の処理をするパターンの中でまだ場合分けが発生するという場合には「ELSE IF」にすると後部分が共通になりますし、同じようにして「ELSEIF IF」なんかも使えます。
アバター
あきと 2019/8/19 6:35 ◆qGd5dQw2g3a2
個人的には「ELSE IF」という書き方は紛らわしいのでしない方がいいと思います。
ブロックが違うという意味で

IF 〜 THEN
ELSE ←
 IF 〜 THEN( ENDIF ) ←
ENDIF

あくまでELSEの中に入ってから書くIFという事でインデントを下げて書いたほうが良いかと。
アバター
アオタク 2019/8/19 14:59 ◆6Tx4tgOERFcr
>>高原のなさん
そもそもブロックの数が違ってたとは...。
それでも使い分けに迷ったらまずは「ELSEIF」を選択しておくと良い訳ですね、ありがとうございます。

>>あきとさん
確かにその書き方なら分かりやすいですね、ありがとうございます。
アバター
アオタク 2019/8/19 18:54 ◆6Tx4tgOERFcr
「○○ブロック」という捉え方は普通に分かりやすいです。
アバター
うょリウム(元 SPDX) 2019/8/21 9:15 ◆UTOEg1c1vr.B
IF THEN
 IF THEN
 ELSE
 ENDIF
ELSEIF
 IF THEN
 ELSE
 ENDIF
ELSE
 IF THEN
 ELSE
 ENDIF
ENDIF
みたいな使い方ももしかしたら…
1行の場合は

Aが1でなければなにもしない前提で
Bが0なら処理A、Bが0以外なら処理A
のような場合、

IF A==1 THEN IF B==0 THEN (処理A) ELSE (処理B)
のように重ねがけもありますが…。
アバター
アオタク 2019/8/21 10:46 ◆6Tx4tgOERFcr
>>うょリウム(元 SPDX)さん
混乱しまくるので何度も見返して理解しておきたいです()
アバター
うょリウム(元 SPDX) 2019/8/21 22:59 ◆UTOEg1c1vr.B
IF A==1 && B==0 THEN

ELSEIF A==1 && B==1 THEN

ELSEIF A==1 THEN

ELSEIF A==0 && B==0 THEN

ELSEIF A==0 && B==1 THEN

ENDIF

みたいなとき(滅多にないと思います)
アバター
うょリウム(元 SPDX) 2019/8/21 23:01 ◆UTOEg1c1vr.B
IF A==0 THEN
 IF B==0 THEN

 ELSEIF B==1 THEN

 ELSE

 ENDIF
ELSE
 IF B==0 THEN

 ELSEIF B==1 THEN
 ENDIF
ENDIF
…と、したほうが分かりやすく…

見返したらなってない気がしますね。
ごめんなさい。忘れてください。
アバター
アオタク 2019/8/21 23:17 ◆6Tx4tgOERFcr
>>うょリウム(元 SPDX)さん
ポカーン(混乱)
アバター
高原のな 2019/8/22 7:35 ◆bY8RViwvoODw
実際に「ある条件下(=IF文の条件文)でやるべきこと(=THEN以下)」を、コードを書く手を動かす前に適当な紙に書き殴ってみて、共通項があるときは共通項を2回書かないように上手にブロックを組んで、共通項がないときはELSEIFを組み合わせて書くのがよいでしょう
コードを書く手が先に動いちゃうタイプだったらとにかくELSE IFでもELSEIFでも好きな方でいいので全部書いてみてから共通項があればIFの順番を入れ替えてみたりして、共通項をカットアンドペーストでくくり出すという手も使えます

さて、1行で書くIFでIFを重ねながらELSEを登場させるのは「ELSEはどのIFのものか」という問題で(コードを読む他人どころか時には書いた本人も)頭を悩ませるので避けた方が良いかなと思います(たまにIFを重ねながらELSEを何度も使ってますが、そのときはELSEの属すIFが明らかになるように気をつけて使ってます)
アバター
アオタク 2019/8/22 15:37 ◆6Tx4tgOERFcr
>>高原のなさん
書いて試すのはかなり重要なんですね。

重複しちゃうと色々管理が難しくなる訳ですね、これから使う時に気をつけておきます。
アバター
高原のな 2019/8/22 20:20 ◆bY8RViwvoODw
よく(と言っても最近僕はあまり聞きませんが)プログラミングにおいて、コピペを悪とする文化があったような記憶があります
この理由が「コードのコピペと同時にバグもコピペされてしまう」「あるコードを直しても、コピペされた先のコードを直し忘れることがある」というところにあるようです。実際最近わたしもこの2コンボを決めてしまって実に悔しかったです。
基本的に共通になるコードは、ユーザ定義命令や共通項の括り出しをすることでできるだけ1回で記述できるようにしたいものです。ただ、必要のないところまで共通化をしようとすると読みづらくて処理負荷も高いコードになってしまうので、どれを共通化するかという取捨選択は慣れとセンスが試されるのかな? 知らんけど。割と最近に共通化に関して興味深いトピックがあったので置いておきます:「シンプルなループ」( http://petitverse.hosiken.jp/community/petitcom/topic/?read=1212&ukey=0 )
アバター
アオタク 2019/8/22 20:50 ◆6Tx4tgOERFcr
>>高原のなさん
不具合まで引きずって来ないように注意する必要があるんですね。
アバター
アオタク 2019/8/22 23:40 ◆6Tx4tgOERFcr
WHILE 1
 VSYNC
 ?"エラー";
WEND
アバター
Na 2019/8/22 23:42 ◆QoELVrBXBQCI
WHILE 1
BEEP 2
?"THEN without ENDIF in 0:0"
VSYNC
WEND

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -