アドベントカレンダー 12日目
みなさーん。Goto使ってますかぁ〜♪
はい。じゃんじゃん使ってますね。
いやー便利便利。
Goto使わないとかないですよねぇ。
とかいうと、
スパゲッティーつくりたきゃ、料理人になれよ!
と罵声を浴びてしまいそうになりますが・・・
javascriptならbreak, continue
perlならlast, next
vb.netでさえexit, continue
などがあるというのに…
残念ながらVBAでは次のループへに該当するものがない…
そこでgotoを変わりに使おうよ。
って話ですよ。
するとね。
gotoなんてスパゲッティーの温床!
gotoなんて使わずに表現できるからそうしなさい!
なんて言うわけですよ。
あの・・・
本来のあるべきコードの解釈をねじまげてまで、
gotoを使わないことに必死になることはないと思うんですよね。
そもそも、にっくきはスパゲッティーなコーディングなわけであって
他の言語のループ制御と同等の使い方と限定したならば
特に問題は発生しないと思うんですけどね。
例えば、ファイルを開き1行ずつ処理する場合
開く→1行データ取得→必要データか判定→必要データを所定の処理をして取得
と考えた場合以下のようにかける。
ポイントは、不要データのコードがかかれている部分
必要データのコードが書かれている部分がネストされることなく
はっきりとわかるようになっていること。
みなさーん。Goto使ってますかぁ〜♪
はい。じゃんじゃん使ってますね。
いやー便利便利。
Goto使わないとかないですよねぇ。
とかいうと、
スパゲッティーつくりたきゃ、料理人になれよ!
と罵声を浴びてしまいそうになりますが・・・
javascriptならbreak, continue
perlならlast, next
vb.netでさえexit, continue
などがあるというのに…
残念ながらVBAでは次のループへに該当するものがない…
そこでgotoを変わりに使おうよ。
って話ですよ。
するとね。
gotoなんてスパゲッティーの温床!
gotoなんて使わずに表現できるからそうしなさい!
なんて言うわけですよ。
あの・・・
本来のあるべきコードの解釈をねじまげてまで、
gotoを使わないことに必死になることはないと思うんですよね。
そもそも、にっくきはスパゲッティーなコーディングなわけであって
他の言語のループ制御と同等の使い方と限定したならば
特に問題は発生しないと思うんですけどね。
例えば、ファイルを開き1行ずつ処理する場合
開く→1行データ取得→必要データか判定→必要データを所定の処理をして取得
と考えた場合以下のようにかける。
ポイントは、不要データのコードがかかれている部分
必要データのコードが書かれている部分がネストされることなく
はっきりとわかるようになっていること。
Sub SampleCode(ByVal FilePath As String)
Dim FSO As Object
Dim FH As Object
Dim OneLine As String
'** Objectの生成 **
Set FSO = CreateObject("Scripting.FileSystemObject")
Set FH = FSO.OPenTextFile(DataFilePath, 1)
Do While Not .AtEndOfStream
'■1行ずつ取得する
OneLine = .ReadLine
'■特定の条件を満たさない行はデータとして取得しない
'空行は次のループへ
If Trim(OneLine) = "" Then GoTo NextDoLoop
'○○を含む行はヘッダー行なので除外する
If 0 < InStr(OneLine, "○○") Then GoTo NextDoLoop
'××を含む行はフッター行なので除外する
If 0 < InStr(OneLine, "××") Then GoTo NextDoLoop
'■上記で除外すべきデータを除いているので
' ○×△なデータだけになっている
'以下いろんな処理
NextDoLoop:
Loop
FH.Close
Set FH = Nothing
Set FSO = Nothing
End Sub
可読性を犠牲にしてまで、スパゲッティー呪文に取り憑かれて
つかわないようにするのはどうなんだろうねぇ。。
と思う今日この頃でした。
0 件のコメント:
コメントを投稿