アカウント名:
パスワード:
第一線のエンジニアという言が真ならば、今時のプログラムなんて楽勝です。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]
# まとめてお返事にて失礼します。
lhs/rhsは、left hand side、right hand side の略です。C++などで演算子オーバーロードで2つのオペランドをlhs/rhsと表現するのはよくみかける表現です。
Javaの話をしているつもりでしたが。そういえば、私の近所の「ベテランプログラマー」もすぐに「C++では」などとのたまうのですが、Javaのコーディングスタイル(しかも命名規約)の話題で、他の言語を持ち出されてもって感じです。「全てのJavaプログラマーはC++の知識が必要」って主張でもないでしょうに。
可換でない演算子の場合、1,2という命名の方が混乱の元になります
その場合は1,2という命名をしないというのは言うまでもないですよね。
そこまで否定するほどの命名規則とは思えないですね。
メソッド名「eq」についてもでしょうか?であれば、初心に帰って勉強しなおすか、潔くプログラマーを引退したほうがよろしいかと。
「value」なのは自明なので、追加情報としては役に立たない。省略が嫌な場合には「
私も良く命名規則とか拘る方なんですが、傍から見てるとキモいですね。 org.apache.commons.lang.builder.* [apache.org]あたりにもあなたの嫌いな例がゴロゴロあるようですよ。よかったですね
ここで言うのも何ですが、 訛りのない Java 言語を話す [ibm.com] の著者は C++ の知識が不十分な気がします。
C++ では、同じクラスのオブジェクトは互いの private メンバー変数を見られないということです。
ダウト
あと、普通の C++ プログラマなら RAII を使うので、try catch を書くのは本当にそれが必要な場合のみに限られます。 リスト13のようなコードに嫌悪感を抱くのは、どちらかと C++ 使いに多いような気がします。
まぁ下らないことに拘っているくらいなら、30 年後でも生き残りそうな新しい言語や概念について勉強するべきでしょう。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
犯人は巨人ファンでA型で眼鏡をかけている -- あるハッカー
楽勝です (スコア: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)
# まとめてお返事にて失礼します。
lhs/rhsは、left hand side、right hand side の略です。
C++などで演算子オーバーロードで2つのオペランドをlhs/rhsと表現するのはよくみかける表現です。
Javaの話をしているつもりでしたが。
そういえば、私の近所の「ベテランプログラマー」もすぐに「C++では」などとのたまうのですが、
Javaのコーディングスタイル(しかも命名規約)の話題で、他の言語を持ち出されてもって感じです。
「全てのJavaプログラマーはC++の知識が必要」って主張でもないでしょうに。
可換でない演算子の場合、1,2という命名の方が混乱の元になります
その場合は1,2という命名をしないというのは言うまでもないですよね。
そこまで否定するほどの命名規則とは思えないですね。
メソッド名「eq」についてもでしょうか?
であれば、初心に帰って勉強しなおすか、潔くプログラマーを引退したほうがよろしいかと。
「value」なのは自明なので、追加情報としては役に立たない。
省略が嫌な場合には「
Re:楽勝です (スコア:0)
私も良く命名規則とか拘る方なんですが、傍から見てるとキモいですね。
org.apache.commons.lang.builder.* [apache.org]あたりにもあなたの嫌いな例がゴロゴロあるようですよ。よかったですね
ここで言うのも何ですが、 訛りのない Java 言語を話す [ibm.com] の著者は C++ の知識が不十分な気がします。
ダウト
あと、普通の C++ プログラマなら RAII を使うので、try catch を書くのは本当にそれが必要な場合のみに限られます。
リスト13のようなコードに嫌悪感を抱くのは、どちらかと C++ 使いに多いような気がします。
まぁ下らないことに拘っているくらいなら、30 年後でも生き残りそうな新しい言語や概念について勉強するべきでしょう。