アカウント名:
パスワード:
第一線のエンジニアという言が真ならば、今時のプログラムなんて楽勝です。GUIだってネットワークだってLLだって、一皮向けばC言語とアセンブリの世界に突入です。ゼロから始めた初学者がJavaで「同じ単語を格納したstringの比較が真にならない」件で悩んでる間に、たぶんJavaに加えてP*言語ぐらいはマスターできてるんじゃないかな。
きちんと基礎の基礎が身についてる人っていうのは、応用習得はびっくりするぐらい早いもんです。私の実例でも、Cとアセンブリしかやってこなかった人が、わずか1週間で、経験3年の奴に勝るとも劣らないC#コードを書いていましたよ。さすがにOOな所は厳しかったけど、delegateやクロージャをばりばり使いこなしてました。
もちろん今時の、オープンフレームワークを切り貼りするプログラムについては数多のライブラリを時間をかけて1つ1つ知っていくしかないのだけど、それは必要になったときにすれば充分じゃないかと。
あ、でもC++には近づかない方がいい。あれを真に使いこなすには少なくとも10年かかる。
Javaで「同じ単語を格納したstringの比較が真にならない」件
たまに真になるんですよね。余計なおせっかいというか何と言うか。
オブジェクト型の比較演算子(==)では内容比較ではなくポインタ比較を行っているためです。String a = "H";String b = new String("H");if (a == b) {...} // ←aとbは同じ内容でも別アドレスの文字列なのでここの条件節は偽になります
それだけだとaがnullの場合にNullPointerExceptionを投げるので、以下のようにする場合もあります。
if((a == null) ? (b == null) : a.equals(b)) {...}
あるいは、こういうのを定義しておいて、public static boolean eq(Object lhs, Object rhs) { return (lhs == null) ? (rhs == null) : lhs.equals(rhs);}
こうするとか。if(eq(a, b)) {...}
「参考になる」じゃねーよ。メソッド名も仮引数名もまるでなってない。典型的にダメなパターン。まるでダメの見本ですね。privateならともかく、publicなメンバの名前にはもっと責任を持って頂きたい。
変に単語を省略しないように。eqは恐らくequalを省略したものだろうけど、あえて省略する意味がありません。仮引数名は省略形が使われることもあるが、lhsって何?全く分かりません。
参考までに、Apache Commons Langの同様のメソッドは、equals(String str1, String str2)です。
# 似たようなコードを書く「ベテランプログラマー」が近くにいるので思わず熱くなってしまった。# ホント、地味に迷惑なんですよ。こういう基本的な部分の非常識さ。いちいち指摘しづらいし。# ちなみに私なら、equals(String value1, String value2)にするかな。
> 仮引数名は省略形が使われることもあるが、lhsって何?全く分かりません。
lhs/rhsは、left hand side、right hand side の略です。C++などで演算子オーバーロードで2つのオペランドをlhs/rhsと表現するのはよくみかける表現です。Boost なんかでも普通に使われてるし。
==の場合は可換だから value1、value2 でもいいかもしれませんが、とかの可換でない演算子の場合、1,2という命名の方が混乱の元になります。
まあ、演算子オーバーロードの無いJavaでは見慣れない表現かもしれませんが、最初に一度説明すれば終わる話だし、そこまで否定するほどの命名規則とは思えないですね。
引数名については#1806916 [srad.jp]でご指摘いただいた通りです。また「str1」だと「str」なのは型を見れば分かりますし、「value」なのは自明なので、追加情報としては役に立たない。省略が嫌な場合には「left」と「right」などいかがでしょう。
ところで「eq」という名前も慣習で色々と使われていまして、ちょっと調べてみました。(「Java以外の慣習を持ち込むな」と言われればそれまでですが)一覧 (もちろん不完全) を貼っておきます。
実際の開発で使用する関数を書く場合には他の言語の慣習を持ち込むのと「オレ省略」の境目は難しいですが、チーム内で了解が得られていれば問題無いかと。
========== 一覧ここから ==========
SAStruts (検索条件) http://www19.atpages.jp/~taipeimaomao/pukiwikiplus/inde [atpages.jp]
Scheme の eq? は Java で言うところの == と似てるので注意。Object.equals に近いのは equal? ですかね
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
日々是ハック也 -- あるハードコアバイナリアン
楽勝です (スコア:5, すばらしい洞察)
第一線のエンジニアという言が真ならば、今時のプログラムなんて楽勝です。
GUIだってネットワークだってLLだって、一皮向けばC言語とアセンブリの世界に突入です。
ゼロから始めた初学者がJavaで「同じ単語を格納したstringの比較が真にならない」件で悩んでる間に、
たぶんJavaに加えてP*言語ぐらいはマスターできてるんじゃないかな。
きちんと基礎の基礎が身についてる人っていうのは、応用習得はびっくりするぐらい早いもんです。
私の実例でも、Cとアセンブリしかやってこなかった人が、わずか1週間で、経験3年の奴に勝るとも劣らない
C#コードを書いていましたよ。さすがにOOな所は厳しかったけど、delegateやクロージャをばりばり使いこなしてました。
もちろん今時の、オープンフレームワークを切り貼りするプログラムについては
数多のライブラリを時間をかけて1つ1つ知っていくしかないのだけど、それは必要になったときにすれば充分じゃないかと。
あ、でもC++には近づかない方がいい。あれを真に使いこなすには少なくとも10年かかる。
Re: (スコア:0)
たまに真になるんですよね。余計なおせっかいというか何と言うか。
Re: (スコア:0)
Re: (スコア:0)
オブジェクト型の比較演算子(==)では内容比較ではなくポインタ比較を行っているためです。
String a = "H";
String b = new String("H");
if (a == b) {...} // ←aとbは同じ内容でも別アドレスの文字列なのでここの条件節は偽になります
Re: (スコア:1)
Re: (スコア:2, 参考になる)
それだけだとaがnullの場合にNullPointerExceptionを投げるので、
以下のようにする場合もあります。
if((a == null) ? (b == null) : a.equals(b)) {...}
あるいは、こういうのを定義しておいて、
public static boolean eq(Object lhs, Object rhs) {
return (lhs == null) ? (rhs == null) : lhs.equals(rhs);
}
こうするとか。
if(eq(a, b)) {...}
Re: (スコア:0)
「参考になる」じゃねーよ。
メソッド名も仮引数名もまるでなってない。典型的にダメなパターン。まるでダメの見本ですね。
privateならともかく、publicなメンバの名前にはもっと責任を持って頂きたい。
変に単語を省略しないように。
eqは恐らくequalを省略したものだろうけど、あえて省略する意味がありません。
仮引数名は省略形が使われることもあるが、lhsって何?全く分かりません。
参考までに、
Apache Commons Langの同様のメソッドは、equals(String str1, String str2)です。
# 似たようなコードを書く「ベテランプログラマー」が近くにいるので思わず熱くなってしまった。
# ホント、地味に迷惑なんですよ。こういう基本的な部分の非常識さ。いちいち指摘しづらいし。
# ちなみに私なら、equals(String value1, String value2)にするかな。
Re: (スコア:1)
> 仮引数名は省略形が使われることもあるが、lhsって何?全く分かりません。
lhs/rhsは、left hand side、right hand side の略です。
C++などで演算子オーバーロードで2つのオペランドをlhs/rhsと表現するのはよくみかける表現です。
Boost なんかでも普通に使われてるし。
==の場合は可換だから value1、value2 でもいいかもしれませんが、
とかの可換でない演算子の場合、1,2という命名の方が混乱の元になります。
まあ、演算子オーバーロードの無いJavaでは見慣れない表現かもしれませんが、
最初に一度説明すれば終わる話だし、そこまで否定するほどの命名規則とは思えないですね。
Re: (スコア:1)
引数名については#1806916 [srad.jp]でご指摘いただいた通りです。
また「str1」だと「str」なのは型を見れば分かりますし、
「value」なのは自明なので、追加情報としては役に立たない。
省略が嫌な場合には「left」と「right」などいかがでしょう。
ところで「eq」という名前も慣習で色々と使われていまして、
ちょっと調べてみました。
(「Java以外の慣習を持ち込むな」と言われればそれまでですが)
一覧 (もちろん不完全) を貼っておきます。
実際の開発で使用する関数を書く場合には
他の言語の慣習を持ち込むのと「オレ省略」の境目は難しいですが、
チーム内で了解が得られていれば問題無いかと。
========== 一覧ここから ==========
SAStruts (検索条件)
http://www19.atpages.jp/~taipeimaomao/pukiwikiplus/inde [atpages.jp]
Re:楽勝です (スコア:0)
Scheme の eq? は Java で言うところの == と似てるので注意。
Object.equals に近いのは equal? ですかね