こんにちは。
プログラミングにおいて、クラスや関数、変数の命名は重要な要素です。
私は個人でゲームアプリ開発をしていて、プログラミングの経験はあまり多くはなく、オブジェクト指向の恩恵を強く感じた事は無いです。
自分で作って自分で見直したり修正をするだけですが、それでもある程度はグローバルな命名ルールを下に設計・命名した方が、後々良いと考えて質問させていただきます。
私がプログラミングや設計(オブジェクト指向言語)をしている時に、命名で迷うのは2パターンあります。
(1):◯◯Managerや◯◯Controllerなど
この2つは、どちらか片方だけにするべきなのでしょうか?
個人的には、ゲーム開発において特定のキャラクターの振る舞いを表すクラスは、ManagerではなくControllerにしています。特に、座標移動をする場合はマネージメントというよりコントロールだと思うからです。
オブジェクト指向的に分割しすぎるのは可読性の低下を招くので良くないというのは間違った考えでしょうか?
オブジェクト指向に適した設計をしていけば、ManagerクラスやControllerクラスは良くないという話は聞いた事があります。絶対神のクラスとまでは行かずとも、八百万の一柱くらいになるのは確かだと思います。
しかし、せっかくの高水準言語なのですから、人間の認知に近い・人間にとってイメージしやすいクラス分割をする方が、可読性が良くなるのではないでしょうか?
(2):上記(1)の◯◯の部分や関数名
単に英語力の問題に近いかもしれません。
しかし、例えばStateのように、この世界の用語を使ったりしてフレームワーク的(パターン的)な意味合いを込めて命名することも多いと思います。
みなさんはこの辺どうしているのでしょうか。積み重ねた経験でしょうか?
みなさんの考えをお聞かせください。
また、参考にされている書籍やWebサイト等ございましたら、紹介していただけると嬉しいです。
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答9件
0
わたしも英語が苦手なのでこちらのサイトをよく使ってます。
codic.jp
投稿2016/05/20 00:26
退会済みユーザー
総合スコア0
0
こんにちは。
ManagerクラスやControllerクラスは良くないという話は聞いた事があります。
「◯◯Managerクラスや△△Controllerクラスという命名は良くない」という一般化は、狭い世界の例を引き合いに出して、それが妥当でない世界の存在を知らないまま、一般化するという人がよく犯すミスの1つと思います。井の中の蛙ってやつです。(私も人のことは言えません。油断するとやっちゃいそうになります。)
例えば、多くの要素がCharactor、Item、Fieldに分類できるプログラムで
CharactorController、ItemManager、FieldManagerのような命名は妥当かもしれません。
オブジェクト指向的に分割しすぎるのは可読性の低下を招くので良くないというのは間違った考えでしょうか?
せっかくの高水準言語なのですから、人間の認知に近い・人間にとってイメージしやすいクラス分割をする方が、可読性が良くなるのではないでしょうか?
大賛成です。
人が理解しやすいように分割することが重要です。
分割することでクラス間I/Fが無駄に発生するようですと、可読性はかなり劣化します。
I/Fは単純でも、折角1画面に収まっているものを無駄に細かく分割すると、やはり可読性は劣化します。
特に後者については、適切な命名をすればその内容を確認する手間が省けるので可読性が上がる旨の意見を公表している人も少なくないです。分かりやすく命名することは重要ですが、誤解のない命名は不可能ですから内容確認は必要です。(特にデバッグ時。)
(2):上記(1)の◯◯の部分や関数名
正直、なかなか難しいです。意味が理解できる名前は非常に重要なのですが、長すぎる名前は逆に可読性を大きく落とすので難しいです。
従って、長くても単語2~3個程度でそのクラスやメソッドの最大の特徴を表現できていることが重要です。しかし、特徴は他のものと比較して発生します。開発当初は左上座標しか必要なかったからPoint getPosition();
で良かったのに、右下座標も必要になったとします。すると、妥当な命名はPoint getTopLeft();
、Point getBottomRight();
のようなイメージになると思います。
つまり、妥当な名前は他との関係において決まるので、プログラムの開発に伴い変化する前提で考えています。時々リファクタリングしつつ妥当な名前に変えるという柔軟な対応してます。(別の表現では行き当たりばったりとも言います。)
投稿2016/05/20 01:26
編集2016/05/20 01:44総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
(1):◯◯Managerや◯◯Controllerなど
この2つは、どちらか片方だけにするべきなのでしょうか?
両者は全く同じ意味というわけではないので、意味に応じて使い分ければ良いと思います。
オブジェクト指向的に分割しすぎるのは可読性の低下を招くので良くないというのは間違った考えでしょうか?
オブジェクト指向的な分割が可読性の低下を招くのではありません。不適切な分割が可読性の低下を招くのです。オブジェクト指向的に分析し、適切に分割(役割分担)すれば可読性が上がるはずです。
オブジェクト指向に適した設計をしていけば、ManagerクラスやControllerクラスは良くないという話は聞いた事があります。
それは誤解です。オブジェクト指向かどうかは関係ありません。ManagerやControllerのような名前だと仕事を押しつけやすいのでクラスが肥大化しがちになる、ということに対する問題提起だと思います。名前がどうであれ、適切に役割分担すれば良いのです。そして、役割にふさわしい名前を付けることで可読性が上がります。
人間の認知に近い・人間にとってイメージしやすいクラス分割をする方が、可読性が良くなるのではないでしょうか?
その通りです。そのために、「設計」に時間をかけてしっかり分析して適切な役割分担を決めるのです。それはオブジェクト指向から外れることではありません。
(2):上記(1)の◯◯の部分や関数名
私は英語力がないので辞書を引きながら名前を付けます。経験というか、各種SDKやOSSを使ううちに、それに影響を受けた部分はあるかと思います。基本的には何をするクラス(メソッド)なのかが判れば良いと思っていますが、業務では命名規則でルールを定めている場合もあります。
投稿2016/05/20 05:13
総合スコア5944
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/20 08:05
2016/05/20 08:26
0
Controller
という名前は画面の実装をするときに使うことが多いかと思います。
例えばPHPです。
http://www.objective-php.net/mvc/controller
ですので、独自で作るクラスにController
という名前は使わないようにしています。
個人的にStaticなメソッドを実装しているものにはHogeUtil
、インスタンス化するものはHogeComponent
としています。※これはどこかの案件でこういう規約だったので、分かりやすいなぁと思ってそのまま使っています。
関数名はメソッドについては基本的に英語ですが、余りに難解な単語を使うと逆に分かり難くなってしまいます。
例えば、Enumのメンバ名を付けるときに全部英語にする
という規約のプロジェクトに参加したときに
あまりにも難しい単語で書く方が居て、他の誰も分からなかった経験があります。
そのため、他のプロジェクトでは全部ヘボン式の日本語にする
としたところ、Cancel
をKyanseru
と書かれてしまい、これも逆に分かり難くなりました。
このあたりのさじ加減は非常に難しいところです。
投稿2016/05/20 01:05
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/20 07:18
0
ベストアンサー
プログラミング言語は英語を元にした、(最終的に)マシン語にコンパイルされる中間言語です。
要するに文章なのです。
郷に入っては郷に従え、英語が元なら英語として読みやすい文章がゴールとなります。
リーダブルコードという書籍は既に目を通していますか?
もしまだなら読んでみてください。
命名はこの書籍の2〜3章に書いてあります。
◯◯Managerや◯◯Controllerなど
その場その場で適していると思う方を使ってください。
どのみちマネージャーもコントローラーも作業を指示するだけのスイッチ郡であるはずです。
座標移動をする場合
それはプレイヤーがコントローラーを操って、
ゲーム内のキャラクターを特定の座標まで移動させる行為
全てをコントローラーの1メソッド中にねじ込んでいるように思えます。
コントローラーは所詮コントローラーです。
ボタンと矢印キーしかないあれです。
オブジェクト指向に適した設計をしていけば、ManagerクラスやControllerクラスは良くないという話は聞いた事があります。
上記参照、Webサイトを構築するためのCakePHP等のフレームワークでは、
MVC(モデル・ビュー・コントローラー)という役割分担を行ってますが、
往々にしてコントローラーがモデルを取り込んでデブデブになってしまうケースがあります。
その辺と混同してるかもしれません。
適切な責務によって抽象化されたクラスの使い方が出来れば、そのような情報に惑わされる事はありません。
みなさんはこの辺どうしているのでしょうか。積み重ねた経験でしょうか?
○○は良いことなのだろうか?悪いことなのだろうか?
…と考える事はとても大事な事だと思います。
しかし、考える事は時間とパワーを使うので、私もついつい慣習で作業をすることがあります。
これは本来でいうと良くない事で、後で見るとリファクタリングしたくなります。
人間の認知に近い・人間にとってイメージしやすい
素晴らしい考えだと思います。
私としては、これはクラスだけに限った話ではなく、プログラミング全体に言えるのかなと考えています。
個人的に面白いと思っているのがプロビジョニングツールのChefですね。
パソコンのマシンの初期設定を行ってくれるこのシェフ、お前料理人じゃん!
そのシェフにクックブックという名のファイルを手渡してやると、それに従って初期設定前のマシンをセットアップしてくれます。
コマンドがレシピ、作業を行うマシンはナイフ・・・うまく比喩を使いながら表現しています。
sailsというWebフレームワークがありますが、
それの起動用コマンドはなんとlift!
海に浮かぶヨットが帆をかけているAA付きでWebサーバーが立ち上がります。
実際にはここまでフリーダムにやれとは思いませんが、
わかりやすく可愛い名前を付けたいですね。
投稿2016/05/20 10:29
総合スコア21194
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/21 04:01
0
私は基本的な命名規則として、
インターフェースは振る舞いや概念を表す名前、
クラスは具体的な実装を表す名前を意識しています。
その名前を日本語で考えて、それを和英辞典に入れてるだけです。
例えば、キャラクターなら
ICharactorという概念を示すインターフェースがあり、
それを実装する形で、MovableCharactorやStrategiedCharactorなどとします。
MovableCharactorは単純に動かす機能を要求する実装で、
StrategiedCharactorは状況判断をしながら自動で動くための戦略を要求する実装、
という具合です。
(実際では、Charactorという概念が広すぎる印象があるので、もう少し具体的な概念に絞ります)
特に、座標移動をする場合はマネージメントというよりコントロールだと思うからです。
私は、平面上の移動という意味でPlanarMovementにするかもしれません。
そして、これは振る舞いなのでインターフェースにします。
さらに、クラスに実装する時に、例えば座標移動が自動か手動かで命名を決め、
AutomationやGamePadとします。
オブジェクト指向的に分割しすぎるのは可読性の低下を招くので良くないというのは間違った考えでしょうか?
個人的には、可読性よりも前に、変化の境界で区切るべきと考えています。
結果として分割されすぎてしまったとしても、
変化する領域から、変化しない領域を保護出来るのであれば、それで良しと考えています。
投稿2016/05/20 04:59
総合スコア227
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/20 07:37
2016/05/20 09:47
0
好みの問題だと思いますが私なら下記のようにすると思います。
・キャラクタークラス
→特定のキャラクターの振る舞いを表すクラス
・複数のキャラクターインスタンスやその他ゲームに関連するインスタンスを管理するクラス
→○○Controller
・通信やファイルなどのフレームワークの機能を使いやすくラッピングしたもの
→○○Manager
しっかりと分割すれば神クラスはなかなか発生しないと思います。たぶん
投稿2016/05/20 01:08
総合スコア18155
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/20 07:31
2016/05/20 07:33
0
理想論を挙げても空論になるので、
まずは、出来る事から、
例えば、
数カ月~数年前の自作コードを見てみる、
⇒理解出来ない。追えない。なら、改善すべき点があるのでは?
代理検索
投稿2016/05/20 00:38
編集2016/05/20 00:42総合スコア2030
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/20 06:59
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/20 00:44
2016/05/20 07:08