【先着1,000名様!】1,000円分をプレゼント!

私はWeb開発者です。
下請け開発の場合に必ず命名規約に疑問を感じます。

原因は「ソースファイル名や画面名、テーブル名などに連番をつける」命名規約が多いからです。

自社で開発する場合は連番は使いません。

連番を付ける理由はいくつか考えられますが、どれも全て単なる慣習としてしか見えないのです。
・COBOL時代にそうしていた
・管理がしやすい。(Excelで扱いやすい)
連番ではなく、各ソースの役割で命名するほうが、理にかなっていると思います。

1、他に理由があれば教えてください。
2、大規模なシステムでも連番では命名したりしないよ、という実例をご存知の方は教えてください。

よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

>2、大規模なシステムでも連番では命名したりしないよ、という実例をご存知の方は教えてください。



大規模とはどの程度なのか定義が不明確ですが、とりあえず、万人月越え・億以上規模と考えることにします。万人月越えのPJは今まで3つ経験しましたが、3つともどこかしらに連番を採用でした。

しかし、現在かかわっているPJも万人月越え見通しですが、ここでは連番は使用していません。このPJではサブシステムごとにJarに分割されていて、ソース管理は比較的よく管理されていると思います。しかし、開発ツールにエクリプスを使用しているのですが、コードアシストでクラスを検索する際に、他のサブシステムとぶつかり同名のファイルが複数存在するので、少しだけ戸惑います。

あと種類ごとに分けるとこんな感じです
画面系:ほとんどが連番採用
ビジネスロジック:連番採用例あり
DBアクセス:連番採用例なし


私もNo3さんとそれほど大きく変わる規模の会社ではないのですけどね…。いろいろあるのでしょうか。
ちなみに社員数700で、ユーザー系システム会社ということもあって自社請けも4割くらいありますが、私の部は8割が大手SIerからのおこぼれです。
    • good
    • 0
この回答へのお礼

画面系が連番採用、というのはどういう理由なのでしょうか?非常に参考になります。DB系はやはり意味を重視するのですね。

お礼日時:2005/11/20 11:48

連番のクラス名を使うという話は、雑誌等で呼んだことはありますが、私の周りでは本当にそうしているという話は聞いたことがないですねぇ。

みんなクラスの役割で名前を付けています。
(ちなみに私は主に大手SIerから一次請け開発する社員数300人程度の会社の者です。)

ところで連番をつけるって言うのは、PKG0012みたいに連番だけなんですか?それともEmployeeManager003のように、役割をあらわす名前に連番を付加するのですか?

後者であれば、クラス名から役割も推測できるので、管理上連番も必要であれば仕方ないと思いますが、もし前者だとクラス名から役割が全くわからないので、困りますね。
    • good
    • 0
この回答へのお礼

PKG0012とか、そういう連番です。
役割は全く分からないんです。。。しばらく経つと忘れるから、仕様書見て思い出して、の繰り返しです。

お礼日時:2005/11/20 11:44

私も何年か前にそういう議論をした覚えがあります。



大規模なシステム開発の際、収拾がつかなくなるため、効率を重視して連番を使用することが多いですね。理由としてはやはり「管理がしやすい」ということだと思いますが、それは非常に重要なことだと思います。

ソースを触る人間が、PG作成・保守・拡張開発とフェーズが変わるごとに変わるのであれば、管理のしやすさを重視するほうが理にかなっているといえると思います。また、処理の流れと管理番号の増加が一致していると何かと直感的にもわかりますから。また処理の流れに沿ってソースをソートできるということも大きなメリットです。


あと、両者の違いはプログラムの質を重視する考え方と、システム全体の質を重視する考え方の違いでもあるのではないかと思います。

sunが推奨する命名規則でも「名詞にしろ」といっているし(あ、Javaを前提に書いてます)、プログラム単体で見た場合、意味のある名前にしたほうが理にかなっていると思えます。

しかし、数百、数千もしくはそれ以上の単位のシステムの場合、同名のクラス名のものも出現するし、それを防ぐために後から作るクラス名が無茶な名称になってしまうこともあると思います。ので、命名に間違いが無く均一な質で作れる記号連番を採用することが多いのだと思います。

DAOは連番にはしないけど…
    • good
    • 0
この回答へのお礼

arakororinさんのように理解したうえで連番を採用されているのならいいのですが、、、。連番にするときは、DAOであろうがなんであろうが、全て連番にしろ、というのが多いです。
私としては間をとって、サブシステム単位の接頭辞をつけるようにしたいのですが。。。

お礼日時:2005/11/20 11:42

COBOLっていうか、IBM360/370のコンパイラ、リンカのシンボルテーブルが6文字しか識別しなかったことの名残ですね。


たった6文字の識別子を自由に命名させていたら、名前がぶつかりまくるので連番にしちゃったわけです。
例えばANSI-Cでも外部リンクを持つ識別子は先頭6文字が【保証】されることになっており、言語仕様として保証しているのはいまだに6文字です。
実際には処理系依存で32文字とか64文字なのですが…

で、外部シンボルが連番ならファイルも連番だろう(昔のCOBOLやFORTRANは1ファイルに1手続きが基本)ということで、なし崩し的に全ての命名規則が連番になったわけです。

本来は、シンボルがバッティングしなきゃいいわけなんですけどね。
スコープの種類も少なく、ネームスペースの概念もない昔のシステムの規約を守らされるのは嫌気がさします。

一応、発言(提案?)できる立場であれば「開発手法が劇的に進化しているのに対して、管理手法が追いついていない状況はいびつだ。今こそ管理手法を改革するべき!!」と力説しています。

最近では汎用を経験していない人が管理職につくことが多くなってきているので、記号的でない命名が許されることが増えてきています。
    • good
    • 0
この回答へのお礼

なるほど、そういう歴史があるのですね。汎用機が専門の会社からWebの仕事を請けることが多いんです。

汎用を経験していない人が管理職、、、どころか、開発経験0の人が上につくのはウンザリしてます。

お礼日時:2005/11/20 11:37

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qinterface,extend,implementのちがい

お世話になります、

Javaを勉強しているのですが、
interface,extend,implementの使い分けがわかりません。

私の解釈としては、
(1)interfaceは、グローバル変数の定義、グローバルメソッドの定義(実装はしない)。

(2)extendは、extendクラスを親クラスとして親クラスの機能を使用できる。

(3)implementは…,implementもextendと同じような意味だと解釈しているんですが、違う点は、implementで定義してあるメソッドは、使用しなくても、実装しなければならないという点でしょうか?

とにかくこの3つのを使い分けるコツとかあれば教えてください。
よろしくお願いします。

Aベストアンサー

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば、getStringLength()メソッドなどが
あったほうが良いでしょうか。
このgetStringLength()メソッドは、2バイト文字も1バイト文字も「1文字」
と数えてくれると言う点で、まさに、日本語クラス用のメソッドだと言えるでしょう。

例えば、Java的に記述すると、、、
class Japanese {
public int getStringLength() {
  ・・・
return strlength;
 }
 ・・・
}

class TextField {
・・・
}

class JTextField extends TextField, extends Japanese {
・・・・
}

C++ではそのように実装するでしょう。
しかし、Javaにはこのような高度な機能はありません。

そこで、生まれた苦肉の策が、「interfaceとimplements」です。

interface Japanese {
public int getStringLength(); // interfaceは実装を含まない!
                 // すなわち「実装の継承」ができるわけではない。
}

class TextField {
・・・
}

class JTextField extends TextField implements Japanese {
・・・・
public int getStringLength() {
  ・・・
return strlength; //implementsの実装を「各クラスで」実装してやる必要がある。
 }
}


結局のところ、Javaでは、複数のクラスを親クラスには持ち得ないため、継承できなかったクラスは「各クラスで実装してやる必要性」があるのです。


ではどのように使うのが効果的か?

なまえのままです。「代表的なインターフェイス」にたいしてinterfaceを使うのが良いと思います。

例えば、プレイヤー系であれば、ビデオ・コンポ・ウォークマン・などにかかわらず、
interface controlpanel {
public play();
public stop();
public next();
public back();
}
というような基本的インターフェイスを「持っているべき」です。

こうすることで、それぞれのクラス宣言の際に、これらの「インターフェイスを持っているべきであり、実装されるべきである」ということを「強く暗示」することができます。
class videoplayer extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

こうすることで、同様のクラスを作成するユーザーは、
「プレイヤー系は、4つ操作が出来るコントロールパネルをインターフェイスとして持つべきなのだな!?」という暗示を受け取り、自分のクラスでもそれを模倣するでしょう。

class mp3player extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

また、これらのクラスを使用するユーザーも、「implements controlpanel」という
表記を見て、「4つの基本操作は押さえられているのだな!」という基本中の基本動作を抑えることが出来ます。

まとめると、クラスに「こういう特徴もたしてください!」「こういう特徴持ってますよ!」という一種の暗示的警告や方向性を与えることができるわけですね。

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば...続きを読む

Qシンボルが見つかりませんというエラーが理解できません。

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Image[3];
Thread t;
int index1 = 0;
int index2 = 0;
String msg = "";
String msg1 = "";

boolean state = false;
Button b1 = new Button("ぐー");
Button b2 = new Button("ちょき");
Button b3 = new Button("ぱー");

public void init(){
for(int i = 0; i<=2; i++){
img[i] = getImage(getDocumentBase(),"hanabi" + (i+1) + ".JPG");
}
add(b1);
add(b2);
add(b3);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
msg1 = "結果は・・";

}

public void paint(Graphics g){
g.drawImage(img[index1],350,30,this);
g.drawImage(img[index2],695,30,this);
g.drawString("コンピューター",420,300);
g.drawString("あなた",800,300);
g.drawString(msg,630,320);
g.drawString(msg1,550,320);
}

public void start(){
state = true;
t = new Thread(this);
t.start();

}

public void run(){
while(state){
index1++;
if(index1 == 3){
index1 = 0;
}
index2++;
if(index2 == 3){
index2 = 0;
}
repaint();
try {
Thread.sleep(60);
}catch(InterruptedException e) { }
}
}

public void actionPerformed(ActionEvent e){
if(state == false) {
start();
return;

}
state = false;
if(e.getSource() == b1) {
msg = "ぐー";
index2 = 0;
}

else if(e.getSource() == b2){
msg = "ちょき";
index2 = 1;
}

else if(e.getSource() == b3){
msg = "ぱー";
index2 = 2;
}
check();
repaint();
}

public void check() {
if(index1 == index2) msg ="あいこ";


else if (index1 == 0) {
if(index2 == 2) msg="あなたの勝ち";
else msg ="あなたの負け";
}

else if(index1 == 1) {
if(index2 == 0) msg="あなたの勝ち";
else msg="あなたの負け";
}

else if(index1 == 2) {
if(index2 == 1) msg="あなたの勝ち";
else msg="あなたの負け";
}

}
}

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Imag...続きを読む

Aベストアンサー

「シンボルを見つけられません。」というエラーの下に何か表示がありませんでしたか?そこにヒントがあると考えられます。
シンボルを見つけられませんといエラーが表示される主な理由は4つあります。
(1)クラス、メソッド、変数などの綴りミスや定義していない変数を使用している可能性がある。
(2)コンストラクタを呼び出すときに、newを忘れている可能性がある。(3)公開されていないメンバーを呼び出している可能性がある。
(4)必要なimport文を記述し忘れている可能性がある。
ここでのあなたのエラーは(1)番ではないでしょうか?上記ではimageとなっている変数がimgになっていますね。
これはエラー表示をよく見ることで意外と簡単に解決できるのです。
ゆっくり丁寧にエラー表示を見るように心がけることが大事ですよ。

Q日付型カラムへのデータINSERT

お世話になります。ひとつご教授ください。

オラクル10g, ojdbc14でjdk1.4.2から接続です。

INSERT命令を使ってテーブルにレコードを追加する際に、DATE型のカラムに対して

INSERT TABLE_A (DATE1, ...) VALUES ('2006-4-27 12:00:00', ...);

を実行するとエラーORA-01861が出ます。そこで

INSERT TABLE_A (DATE1, ...) VALUES ('2006-4-27', ...);

このように記述して再度実行すると通ります。

このようなとき、時間の部分まで設定した値をカラムに格納したいときはどうしたらよろしいでしょうか?

よろしくお願いします。

Aベストアンサー

ごめんなさい。
説明と文例が違ってしまいました。
正しくはこちらです。

INSERT TABLE_A (DATE1, ...) VALUES (to_date('2006-4-27 12:00:00','yyyy/mm/dd hh24:mi:ss'), ...);
というように、to_date関数を使うのが一般的かと思います。

Q英語で「個数」「件数」は?

質問は単純です。
英語で「個数」や「件数」をなんというか、です。

とりあえず、思いついたのは、numberでした。
たとえば、「りんごの個数」は"a number of apples"ですか?
でも、"a number of"は「いくつかの」という意味ですよね。

「データの件数」は"a number of data"でしょうか?

私は英語はほとんど出来ませんが、numberは「個数」というよりも「番号」という意味であるような気がしてなりません。

Aベストアンサー

>「個数」や「件数」をなんというか、です。
>とりあえず、思いついたのは、numberでした。
意外に思われるかもしれまんせんが、語の選択はnumberであっています、と思います。

>「りんごの個数」
the number of (the) apples

>「データの件数」
the number of (the) data

>numberは「個数」というよりも「番号」という意味であるような気がしてなりません。
実は、昔、私も、「個数や件数はなんていうのかな、え、number? え、本当?」と、奇異に感じたことを、思い出しました。

Qupdate文で改行を入れる

こんにちは。
いつもお世話になっています。

update文を使用して、データに改行を入れたいのですが、どうすればよいでしょうか。

対象列のデータ型はVARCHAR2です。

例えばSQLPLUSから、
SPL>update 「テーブル名」set 「対象列」='あ改行い改行う改行'
を投入し、そのあと
select 「対象列」 from 「テーブル名」
とすると
SQL>あ
SQL>い
SQL>う
と出てくればよいんですが、
SQL>update 「テーブル名」set 「対象列」='あ\nい\nう\n'
としても
SQL>あ\nい\nう\n
と、「\n」が文字列としてでてきてしまいます。

SPL>update 「テーブル名」set 「対象列」='あ
2い
3う'
と投入すると、期待通りになるのですが、
そうではなく一行にまとめたいのですがどうすれば良いでしょうか。

Oracle9iを使用しています。
宜しくお願いいたします。

Aベストアンサー

こんにちわyukio200263さん
以下のSQL文でどうでしょうか?

UPDATE 「テーブル名」
SET 「対象列」= 'あ' || CHR(13) || CHR(10) ||'い'

ちょっと長くなってしまいますが、一行で可能です。

Qprivate static という変数の修飾

お世話になります。

private static final String HOGE = "hoge";

という変数(finalなので定数ですが)があるとします。このような、privateでstaticな変数というのは、どのような使われ方を意図しているのでしょうか?privateな変数がstaticである必要は、どのようなときに生じるのでしょうか?

よろしくご教授ください。

Aベストアンサー

 その private な変数が所属するクラス自身がいくつも定義された場合に、プログラム全体で1つのメモリしか確保されなくなります。
 なんで、メモリ量がものすげー切羽詰ってるときとか、ほんの数バイトでも節約した方がいい気がするときに有効です。

Qbashなどのシェル変数の値に改行を含める事は可能でしょうか?

タイトルの通りですが、通常のシェル変数の値として

 [prompt]$ aaa="bbb<改行>ccc"

のようなセットを行い、

 [prompt]$ echo $aaa
 bbb
 ccc
 [prompt]$

のような結果を得たいのですが、可能でしょうか。

Aベストアンサー

可能です.
というか,やってみたら出来ることがわかると思います.こんなところで聞くより早い.
なお,sh/bash系では改行文字は特にエスケープせずそのまま入れられます.

aaa='bbb
ccc'

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

QSQLで違うテーブルの値を比較して値に差があるレコードを抽出したいので

SQLで違うテーブルの値を比較して値に差があるレコードを抽出したいのですがヒントをいただけないでしょうか。
下に例を作ってみました。(テキストに貼りなおしてもらうと見易くなると思います)
<Aテーブル>
A1A2A3A4A5
------- ------- ------- ------- ----------
XXXXXXX XX1ABC32009/05/08
WWCWWCW WW2CCB12008/03/21
DDDDDDD DD1JPN52007/08/08
GGGGGGG GX9SOX21977/01/04
FFFFFFF USJNPB32001/09/11


<Bテーブル>
B1B2B3B4B5
------- ------- ------- ------- ----------
XXXXXXX XX1ibichaoshimu2002/07/05
XXXXXXX XX1takeshiokada2005/07/15
XXXXXXX XX1kamoshu1857/09/25
WWCWWCW WW2waowao2008/10/22
DDDDDDD DD1uihhh2006/06/30
DDDDDDD DD1jojoj x5xx1999/09/09
DDDDDDD DD1momohara2005/03/07
DDDDDDD DD1itaiu-2003/12/22
DDDDDDD DD1komanogoal2007/04/26
GGGGGGG GX9 damerecord2009/11/14
FFFFFFF USJ ikitai1995/08/15
FFFFFFF USJ sstebuspi2004/01/05
FFFFFFF USJ bbpp2009/08/23

A1とB1は主キー、A2とB2は副キーです。
Aテーブルの「A4」カラムにはBテーブルのレコード数を持っています。(主キー、副キーが同じものの)
しかし、よくよく見るとAテーブルの「GGGGGGG」のA4には「2」のはずなのにBテーブルには実際にレコードは1つしかありません。
こういう状態になってしまっているのを割り出したいのですがどのようにA4とBテーブルで数があってないものを抽出できるでしょうか。
よろしくお願いいたします。

SQLで違うテーブルの値を比較して値に差があるレコードを抽出したいのですがヒントをいただけないでしょうか。
下に例を作ってみました。(テキストに貼りなおしてもらうと見易くなると思います)
<Aテーブル>
A1A2A3A4A5
------- ------- ------- ------- ----------
XXXXXXX XX1ABC32009/05/08
WWCWWCW WW2CCB12008/03/21
DDDDDDD DD1JPN52007/08/08
GGGGGGG GX9SOX21977/01/04
FFFFFFF USJNPB32001/09/11


<Bテーブル>
B1B2B3B4B5
------- ------- ------- ------- ----------
XXXXXXX XX1ibichaoshimu200...続きを読む

Aベストアンサー

SELECT A.* FROM Aテーブル A
INNER JOIN
TABLE(SELECT B1,B2,COUNT(*) SU
FROM Bテーブル GROUP BY B1,B2) B
ON A.A1=B.B1 AND A.A2=B.B2
AND A.A4<>B.SU

または

WITH B(B1,B2,SU) AS
(SELECT B1,B2,COUNT(*) SU
FROM Bテーブル GROUP BY B1,B2)
SELECT A.* FROM Aテーブル A
INNER JOIN B ON A.A1=B.B1
AND A.A2=B.B2 AND A.A4<>B.SU

こんなのでどうでしょうか?
後者の方が標準的(他のDBシステムでも
使える可能性が高い)かと思います。

QLEFT JOINが2つあるSQL文でANDの意味

■下記SQL文の意味を教えてください

SELECT a.*, b.being_name
FROM alive a
 LEFT JOIN being b ON a.hoge_id = b.id
 LEFT JOIN call c ON c.call_id = a.hoge_id
  AND f.hoge_id = 12
 WHERE f.hoge_id = 12 OR b.id = 12

※12の部分は動的に切り替わります

・LEFT JOINが2つあるので、3つのテーブルを結合しているのでしょうか?
・左テーブルは「alive a」で、この右側に2つのテーブルが結合している、という認識でよいでしょうか?

>SELECT フィールド名 FROM テーブル名 WHERE 条件式1 AND 条件式2
>「AND」は2つの条件式の論理積
・上記内容をネットで見かけたのですが、「AND」は、「WHERE」の前に来てもいいのでしょうか? それともこのSQLの「AND」は違う使い方をしているのでしょうか? 何か、LEFT JOINに関係しているのでしょうか?

■下記SQL文の意味を教えてください

SELECT a.*, b.being_name
FROM alive a
 LEFT JOIN being b ON a.hoge_id = b.id
 LEFT JOIN call c ON c.call_id = a.hoge_id
  AND f.hoge_id = 12
 WHERE f.hoge_id = 12 OR b.id = 12

※12の部分は動的に切り替わります

・LEFT JOINが2つあるので、3つのテーブルを結合しているのでしょうか?
・左テーブルは「alive a」で、この右側に2つのテーブルが結合している、という認識でよいでしょうか?

>SELECT フィールド名 FROM テーブル名 WHERE 条件式1 AND 条件式...続きを読む

Aベストアンサー

>・LEFT JOINが2つあるので、3つのテーブルを結合しているのでしょうか?
はいそうです。

>左テーブルは「alive a」で、この右側に2つのテーブルが結合している、という認識でよいでしょうか?
はいそうです。(alive→beingって言うような意味です。)

>・上記内容をネットで見かけたのですが、「AND」は、「WHERE」の前に来てもいいのでしょうか?
「AND]は「WHERE」にかかっているのではなく「LEFT 」の結合の条件となります。
SELECT a.*, b.being_name
FROM alive a
LEFT JOIN being b ON a.hoge_id = b.id
LEFT JOIN call c ON (c.call_id = a.hoge_id AND f.hoge_id = 12)
WHERE f.hoge_id = 12 OR b.id = 12

<<追記>>
このSQLにはfというテーブルが存在しないのでエラーとなります。


人気Q&Aランキング