プロが教える店舗&オフィスのセキュリティ対策術

こんばんは、Java初心者です。
ある動画にて、forループメソッドを表記する際に

for( int i = 0 ; i ≦ 4 ; i++){
処理


と書いた場合、いかにも初心者っぽいので 、< 記号を使うのが現場では常識と言っていました。

個人で書くならまだしも、共同作業では<記号を使うのが常識なのでしょうか?

質問者からの補足コメント

  • HAPPY

    皆様、ご回答有り難うございます。

    どの方も、相当の経験を積んでおられるようで、勉強になりました。

    ベストアンサーが1名しか選べないのが、心苦しいですが、今後もどうぞよろしくお願いいたします。

      補足日時:2016/04/11 20:37

A 回答 (5件)

for文のiなどのループ変数が0始まりだから。



例えば変数xがあって3が代入されていたとすると、
for( int i = 0 ; i ≦ x ; i++ とすると4回実行される。

実際にはDBから取り込んでXに代入した値を処理回数にする事の方が多い。つまりこの場合には3回処理したい。

for( int i = 0 ; i ≦ 4 ; i++)と書くと4は4回と言う意味ではなくなってしまう。
非常に紛らわしい。0始まりである弊害。

これを解り易くする為、現場では< 記号を使う。
    • good
    • 0
この回答へのお礼

なるほど、ありがとうございました。

お礼日時:2016/04/11 20:21

30年ほど基本ソフトの開発や応用システムの開発をしていまいたが。

。。

> いかにも初心者っぽいので 、< 記号を使うのが現場では常識と言っていました。

 「これこれしかじかで、≦を使うとこういう誤りを起こす可能性があるから、こういう場合には<を使うようにしなさい」との説明があかったのでしたらそれに従うのがよいですが、ご質問に書かれている説明だけなのでしたらソフトウェア開発に関して大したスキルを持っている人ではないでしょう。恐らくその意味するところ、本質を理解していない。。。

 初心者っぽいということは「誰にでも分かりやすい」ということだと私は思います。
 ソフトウェアは一度作ると形を変えながら長く生き延びます。最初に作ったシステムは無くなってしまっても、その中にあった機能は次の世代のシステムの中にそのまま持ち込まれることもあります。あたなが別の部署へ行っても、別の会社へ行ったとしても今作ったシステムは使われ続けます。
 つまりあなたがいなくなても誰かが面倒を見るのです。ですから設計書やコーディングは分かりやすさが大切です。
 こうやった方が機械語に落ちた際の命令数が少ないとかいったことはもうずいぶん前からコンパイラの最適化機能がかなり頑張ってやってくれます。高速のCPUがカバーしてくれます。ぎりぎりめいっぱいシビアな分野のリアルタイム処理や、ほんのわずかな高速化が大きな処理時間短縮につながる大規模シミュレーションのようなプログラムでも限り「人の分かりやすさ」「可読性」を犠牲にしてまで凝る必要はありません。
 なので、、、


> いかにも初心者っぽいので 、< 記号を使うのが現場では常識と言っていました。

などと言ったお遊び事を言っている人間のいう事は重要ではありません。
 それよりも「for( int i = 0 ; i ≦ 4 ; i++)」が「for( int i = 0 ; i < 5 ; i++)」よりこの部分の処理の意味合いを誤解無く示すのであれば「for( int i = 0 ; i ≦ 4 ; i++)」とするのが適当です。
 そこでその人が言う所の初心者っぽく見せないために「for( int i = 0 ; i < 5 ; i++)」と書いた時、「なぜ5なの?」「5は何処から来たの?」となるようでは本末転倒。プロとしての配慮が無い自己満足だけのコーディングだと言えます。
 逆に今の「for( int i = 0 ; i ≦ 4 ; i++)」がそうなら意味の分かりやすい形に直すのが適当です。それが「for( int i = 0 ; i < 5 ; i++)」なのか、「for( int i = 1 ; i ≦ 5 ; i++)」なのかは仕様によるのでわかりません。

 ちなみにこのforループの初期値と繰返し条件のところの分かりやすさの問題はJavaに限りません。
 配列の位置情報としてカウンターは0から使いたい。でも繰返し条件は回数とか配列の個数とかであることが直観的で分かりやすい。。。
 経験的にはfor文の初期値、繰返し条件に使用する変数名はそこに格納される値が位置なのか個数・回数なのかが分かるようにすることが重要と思います。
 C言語系では昔から i、jを(リッチー&カーニハンの教科書がそうだったので)常用していますが、Javaはそれに付き合う必要はないと思います。もっと自由に分かりやすく書けばよいと思います。もちろん、その際にソース上に加筆するコメントも重要です。
    • good
    • 0
この回答へのお礼

>>経験的にはfor文の初期値、繰返し条件に使用する変数名はそこに格納される値が位置なのか個数・回数なのかが分かるようにすることが重要と思います。

そうなのですね、これから意識して使用をするようにします。
実際動画では、配列の話をしていて、その回数分だけ回すのに使用をしていました。

お礼日時:2016/04/11 20:24

まず。


そもそも「≦」は使えません。
「以下」を意味する演算子は 「<=」です。


> いかにも初心者っぽいので 、< 記号を使うのが現場では常識

ただこう説明していたのなら、正直よくない説明だと思います。
ループの内容によって使いわけるべきものです。


例えば、forループがよく使われる場面に、配列の全要素について処理する、というのがあります。
長さlengthの配列は 0〜 length-1 の添字を持ちます。
このことから、次のような書き方になります。
for(int i=0; i < a.length ; i++ )
for(int i=0; i <= a.length -1 ; i++ )
この場合、慣れの問題もありますが、
・前者には「配列全体」だという意図を感じることができます。
・後者は、文字数も増えているし、 -1 に何か意図があるのでは、と一瞬考えてしまいます。
となります。

これが「最後から一つ前まで」となると
for(int i=0; i < a.length-1 ; i++ )
for(int i=0; i <= a.length -2; i++ )
for(int i=0; i <= a.length -1-1 ; i++ )
となって
・1番目の -1 は、「最後から一つ前」の意図を感じる
・2番目の -2 は、一瞬、何を意味しているか分からない
・3番目の -1 は、「最後から一つ前」の意図は感じるが、-1-1となるのが冗長
となります。

このような「0から始まるループ」はプログラムでよく出てくるので、「 <= 」よりは「<」 の方がループの意図がわかりやすくなることが多く、「現場」でもよく見かけることになります。



ですが、これが「a≦n≦bの整数を足す」みたいなものだと
for(int n=a; n <= b ; n++ )
と書いた方が圧倒的にわかりやすいです。
for(int n=a; n < b+1 ; n++ )
と、無理に < を使ったり
for(int i=0; i <= b-a ; i++ ) { int n=a+i ;
for(int i=0; i < b-a +1 ; i++ ) { int n=a+i ;
と、無理に「回数」にしたりすると、よくわからなくなります。
    • good
    • 0
この回答へのお礼

ご回答有り難うございます。

>for(int i=0; i < a.length ; i++ )
>for(int i=0; i <= a.length -1 ; i++ )

確かに上の例のほうが、ぱっと見で配列の個数分だけループを回しているだなとわかりやすいですね。
可読性については、全然経験不足なのですが、意識して作るようにします。

お礼日時:2016/04/11 20:27

「境界法」という、インデックスを使ってデータの


範囲を表す方法があって、例えば配列 a のデータの「部分」を
指定する場合

beginIndex = 1, endIndex=4 は
a[1], a[2], a[3] を表します。
つまり、
beginIndex <=配列のインデックス<endIndex
が、beginIndex , endIndex で示された範囲です。

a[0], a[1], a[2], a[3] なら beginIndex = 0, endIndex=4

なぜ、こんな書き方をするかというと

(1) endIndex - startIndex = 範囲の中のデータの個数。
(2) endIndex = startIndex で空のデータ範囲を表せる。

となかなか美しい性質があるからです。Cでは伝統的に
この書き方が使われてきたので、Javaにも受け継がれていますね。

「境界法」とは配列を

a[0], a[1], a[2], a[3], a[4] と並べた場合、
startIndex = 1 とは, a[0]とa[1]の間(境目)にある範囲の開始点
endIndex = 3 とは、a[2]とa[3]の間(境目)にある範囲の終了点

というように、インデックスが配列要素間の境目を指すと考える
範囲の表現方法です。
#エディタのアイビームカーソルのようなものです。

APIの中でも、String#substrの文字列の範囲の指定の仕方とか、
随所でこの範囲の指定法が使われています。

もちろん、beginIndex <=配列のインデックス<=endIndex
として、空の範囲は、beginIndex >endIndex と表しても
よいのですが、ちょっと美しくないのと、異なる1だけずれた考え方を
混在させるのは混乱のもとになるのです。統一するべきでしょう。

というわけで、たいていの人は「境界法」の考え方で
ループを回すことが多いです。
    • good
    • 0

ANO4です。

いつのまにか説明に
startIndex とbeginIndexが混在してますが
同じものです。気にしないで下さい(^-^;
    • good
    • 0
この回答へのお礼

ご回答有り難うございます。

境界法という考えがあるのですね。
参考になります。

お礼日時:2016/04/11 20:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!