ここから本文です

ソース上でのクラスの記載する位置についてお尋ねします。 オブジェクト指向の...

bes********さん

2019/11/1500:07:45

ソース上でのクラスの記載する位置についてお尋ねします。

オブジェクト指向のサンプルをみると、大抵は最初にクラスが定義されて、下の行でそれを利用する様に記述されています。

スクリプトなので、そうなのかもしれませんが、最後に書いても、問題なくnewができ、利用する事が出来ます。

標準的な規約や、オブジェクト指向のソースコーディングの常識では、上部に書くか、別ファイルにし、それをインクルードして書くのが当たり前かと思います。

しかし、ユーザー定義関数の例だと下の行に関数の定義です。

自分は、普通の関数のように、下に書いてしまいたくなるのですが、デメリット等ありますでしょうか? (下記のように)
<?
$obj = new a();

$obj->f1();

class a {
function f1 () {
echo "hello\n";
}
}

あまりにも当たり前の質問かもしれませんが、よろしくお願いします。

補足補足です。
オブジェクトでないC言語等の関数型(?)は、main()関数があって、下の方にサブ関数が記述します。
Javaは、C言語と同じようにコンパイルするので、下の方でクラスを記述するのも問題ないはずなのに先に記述します。(コンパイルエラーになるんでしょうか?)
中にはそういう書き方(クラス定義を後に書く)している人もいるかと思ったんですが、検索しても上にクラスを書いているサイトばかり。

でも、クラスが下に出て来ると、関数と違って見栄えがよろしくない感じがするし、人間が見落としてエラーを誘発するのも事実です。
エラーとならずに動くのに、動作させた時に何かバグの要因になるのがあるんだろうかと気になり、尋ねてみた次第です。
作法だと言えば、分かりましたという感じですが。

閲覧数:
42
回答数:
4
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

kak********さん

2019/11/1512:36:13

ソースコードは人間が読むものですので、理解しやすく読みやすいことを優先されるのが良いと思います。

質問した人からのコメント

2019/11/20 08:22:03

やはりこれですね。
ありがとうございます。

ベストアンサー以外の回答

1〜3件/3件中

並び替え:回答日時の
新しい順
|古い順

qo_********さん

2019/11/1610:40:46

>デメリット等ありますでしょうか?
そのクラスが書かれたファイルをロードすると、
毎回、余計な処理が走る。

修正箇所がクラス本体と呼び出し部分かが分からない。
クラスが正常動作するか、毎回テストする必要がある。
--
PHPでのお約束。
・1ファイル、1クラス。
・クラスを呼び出すコードは上記とは別に書く。
・名前空間を考慮し、適切なディレクトリ階層にファイルを配置。
・クラスのオートロードはComposerのものを使う。
・composer.jsonに、useでのエイリアスと、
クラスファイルの場所をPSR-4の書き方で指定する。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

prwssさん

2019/11/1511:47:05

>C言語等の関数型(?)は、main()関数があって、下の方にサブ関数が記述

これは勘違いでして、C言語の場合は関数定義を上に出来ます

以下のようなコードの場合、使う関数の定義はコンパイルの関係上、その関数を使うよりも先に書かなくてはならないのですが、上手いこと順番を調整すると、全てをmain関数の上に書くことが可能です

つまり、C言語は『main関数の下に「サブ関数」を記述せねばならない』……というルールではないです

基本的には「使うよりも先に書く」です

なので、main関数よりも先に関数を書けます

***


#include<stdio.h>

#define N 100

void swap(int* x, int* y){
const int temp = *y;
*y = *x;
*x = temp;
}

void standard_value_sort(int num[], const int n, const int sv){
int i, j;
for(i=0, j=0; i<n; i++){
if(sv >= num[i]){
swap(&num[i], &num[j]);
j++;
}
}
}

void show(int num[], const int n){
int i;
for(i=0; i<n; i++){
printf("%d ", num[i]);
}
}

int input(int num[]){
int n;
scanf("%d", &n);

int i;
for(i=0; i<n && i<N; i++){
scanf("%d", &num[i]);
}

return n;
}

int main(void){
int num[N];
int n = input(num);
standard_value_sort(num, n, num[0]);
show(num, n);

return 0;
}

プロフィール画像

カテゴリマスター

tezcelloさん

2019/11/1500:38:28

スクリプトファイルの上部にクラス定義を書くのは、スクリプトを読む際は先頭から読むからだと思います。

ファイル下部にクラス定義があっても特に実行上のデメリットは無いと思いますが、定義を見ていないのに使用箇所があるのは、使用箇所から定義部分が見えるほど短いスクリプトか、どんな定義かを覚えている時でなければ、とても不安に思えませんかねぇ...
__クラス名やメソッド名で何をやっているのか判るなら
__不安も出ませんが


今時は、クラスを別ファイルにしてオートロードが当たり前だと思いますが、一つのファイルにしてしまいたいのなら、位置も含めてご自由に。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

このカテゴリの回答受付中の質問

一覧を見る

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる