質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.36%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

解決済

4回答

6059閲覧

オブジェクト指向で組まれたソースコードの読み解き方について

manzyun

総合スコア2244

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

7クリップ

投稿2018/10/12 00:41

編集2018/10/12 03:00

前置き

この質問は、皆さんにソースコードの読み解き方の考え方をご指導いただきたく立ち上げました。
コーディングに疲れた際の息抜き感覚で答えていただけると幸いです。

背景

現在業務で Open-Source Subscription Billing & Payment Platform - Kill Bill が、実務で使えるか、使うにはどの様にするかという調査をしております。(支払い・決済システムのオープンソースソフトウェアです)

恥ずかしながら、私自身専門学校の授業でJavaのCLIアプリを作った程度の者のため、最近のJavaの読み方・書き方は愚か、ここまで大規模でデザインパターンやデータドリブン・イベントドリブンな設計のソフトウェアの動作を読み解くのに、とても難航しております。(素直に申し上げると、ユーザーガイドの読み解きにも行き詰まりを感じております)

素直な感想を申し上げると、簡単なVB.netのソースコードの読み書きはできるのに……と悔しい気持ちでいっぱいです。

質問

そもそも私のオブジェクト指向の理解が漠然としているからソースコードの読み解きに難航しているのだと思いますが、
皆さんは大規模なオブジェクト指向で組まれたプログラムの読み解きを行う際は、どの様なことを意識しているのでしょうか?

  • 読み解く際の考え方
  • ソースコードリーディングする際に使うツール
  • 読み解くに当たって参考にした資料
  • etc...

「これ、今どきのプログラマだったら普通に分かってるだろう……」
と思うようなことでも構いません。自分や「オブジェクト指向に馴染みがない人」のアドバイスになるかもしれないと思いましたら、ぜひご回答いただけると幸いです。

P.S. 質問者の技量

回答する際の参考になるかわかりませんが、筆者の技量を掲載いたします。

業務経験など

  • 2000年: HotSoupProcessorで ifgoto のみで構成されたスクリプトを書く
  • 2008年: Pythonで if, for, while, def, class で構成したスクリプトを書く
  • 2011年: 2年生専門学校卒
  • 今日まで: 2, 3年ブランクはあるものの、プログラマとして働いている
  • GitHubには亀よりも遅い開発速度だが、趣味で作ったプログラムを公開してたり。manzyun (Hidetsugu Takahashi)

使用経験のある言語

  • Python
  • VB(6, .net)
  • C#
  • PHP
  • JavaScript
  • Go
  • TypeScript

趣味で触っている(触った)言語

  • Nim
  • Haskell
  • Scheme
  • Smalltalk(Pharo)

(一応)読んだ書籍

  • Java言語で学ぶデザインパターン入門 / 結城浩
  • その他、Webの記事(TECHSCOREなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takasima20

2018/10/12 00:58

おつかれさまです。もし user guide をよんでないなら、そっちからイメージつかむようにした方がいいんじゃないかなあ。
manzyun

2018/10/12 01:03

ユーザーガイドは頭から湯気が出そうなくらい読んでるつもりなのですが、それでも「じゃあ自分たちが求める仕様はどうなってる?」というのが読み解けないです……。これはリーディング以前の問題ですかね。
yoorwm

2018/10/12 01:06

名前からすると、支払い関係のAPIのようですが、決済の流れについての業務知識とかはありますか?もし無かったとするなら、プログラム知識だけで理解出来ないのも当たり前かと思います。
manzyun

2018/10/12 01:08

決済の流れは、これの調査をし始めて(2ヶ月前)学んでいるところですね。大まかなフローは掴めたつもりなのですが。
takasima20

2018/10/12 01:30

一般的な話になりますが、誰かに説明する(つもりで)資料を作ってみては? なるべく期限を設けた方がいいかな。自分の中だけでぐるぐるしてるだけでなく、アウトプットするのが必要なように感じました。
manzyun

2018/10/12 01:32

なるほど。確かにインプットばかりで疲弊もするし、整理もできていないかもしれないです!
guest

回答4

0

ベストアンサー

こんにちは。

短い回答ですが、
正しくオブジェクト指向されたライブラリを読むには、インターフェース、クラス、メソッド、変数の「名前」を最重要視して読んでください。
クラスの名前がわかった上で、その継承関係や実装されたインターフェースの名前、所有しているメソッドの名前がわかれば、「そのクラスが何をするものなのか」がわかるようになっています。なっているはずなのです。
その上で、オブジェクトは手でつかめる(プログラムで取り扱える)データの最小単位、メソッドはデータに対してアクションを起こすもの、ゲッター(プロパティ)はオブジェクトの状態を覗き見るものと「看做して」、それ以上の詳細に立ち入らずに全体を俯瞰してください。
オブジェクト指向は、大規模なコードを隅々まで把握することは現実的に困難であるという前提の上で、それらの抽象だけでプログラミングを行うことで大規模なシステムを組み立てることを可能とする思想だからです(一部の側面)。

投稿2018/10/12 02:45

tamoto

総合スコア4232

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

manzyun

2018/10/12 02:53

なるほど、「名前大事」ってやつですね! 自分は入り込み過ぎて逆に混乱しているのかもしれません。 本当に必要になった時に内部処理を見ていくくらいがちょうど良さそうですね。ありがとうございます。
guest

0

Javaを読む時に、多くの人がつまずくのは抽象メソッドの部分です。
インターフェースや抽象クラスの部分です。
呼び出されているメソッドを見にいっても実装が何もなくて困ってる人をたくさん見てきました。

通常のテキストエディタで読むのは、ものすごく効率が悪いため
Eclipse, IntelliJ IDEA, NetBeansなどのIDEと言われるツールで読みましょう。
ツールの使い方はある程度覚える必要がありますが、読むだけならそんなに多くの機能はいりません。

・クラスやメソッドの宣言部分へのジャンプ
・どこから呼び出されているか
・抽象メソッドの実態はどこにあるか

上記のような機能が使いこなせれば効率はとても上がります。

投稿2018/10/12 01:42

編集2018/10/12 01:43
root_jp

総合スコア4666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

manzyun

2018/10/12 01:47

確かに定義元を参照していった結果、抽象クラスだった時に、愕然とした感情を覚えますね。 メソッドへのジャンプは頻繁に使いますが、呼び出され先や実態のショートカットを把握して無いため、コードを読む際の効率が低い気はしてます。ありがとうございます。
root_jp

2018/10/12 01:56

IDEも使ってはいるようですね。では具体的に何に困っているんでしょうか? オブジェクト指向とは言いますが、C#の経験もあるんですよね。 C#ができればJavaを読むことは余裕だと思います。
manzyun

2018/10/12 02:33

自分でも実は何に困っているのか、問題がきっとありすぎてはっきりしていないのだと思います。 質問への追記依頼のところでも少し触れましたが、まず決済システムなので決済の基本を分かっていないのは否定できません。コード位細かくない、もっと大きなフローの理解が足りていないのかもしれません。 ソースそのものは読み解くのは難はないと思うのですが、いかんせん抽象化したものやインターフェイスクラスの使い方を、その単体のクラスファイルのソースコードから読み解こうとしてしまっているという、意識の問題もあるかもしれません。
guest

0

こんにちわ

僕としてテストコードを書くのをお勧めします

まず、Kill Billのドキュメントから適当なメソッド(できれば実務に関係あるもの)を選んでそれを用いてIn/Outを確かめるテストコードを書いてはどうでしょうか
実際にコードを書いた方が理解が進むかと

それをどんどん広げていけば、気づいたら全体像が分かっていると思います

また、頑張って解読して良い資料を書いて稟議に通って実務で使います、となったときに、manzyunさんが一度通った苦労を他の開発者もすることになると思います
テストコードを書いておけば、それを見れば挙動がわかる(と思う)ので、新規参画者がスムーズに参加できるプロジェクトになるのではないでしょうか

さらに、OSSって大抵サポートは手厚くなくてデグレ対応は使う側が頑張ることになりますが、テストを書いておけば以前の挙動が明確なので、その対応も容易いかと思います

ちなみにこの手法は、サードパーティ製のライブラリを使用する上での有効な学習方法として、クリーンコードなどにも載っていた手法です(露骨な権威付け)

(実際に何か開発するならKill Billをラップして直接扱わないことを勧めますが)

投稿2018/10/15 12:22

kanaria007

総合スコア67

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

manzyun

2018/10/16 04:10

おお、なるほど、テストコードでIn/Outの確認ですか! 「既にテストコードがあるから、そっちを読めば分かる」 と勝手に思って、自分の手は動かしてなかったですね。 クリーンコードにも載っている手法でしたか。
guest

0

まず、私は趣味でやっていて、業務とは違うと思いますが私の方法でよければ。

私はC++をやっていて、最近( 今年入ってから。 ) Qt っていうライブラリを使うようになりました。

それはOOPになっているみたいです。( ただし、厳密なOOPでない。C++ですらOOPじゃないとの批判があるぐらいだし。 )

まぁ、それはともかく、私ならdocumentationを読みます。

やりたい処理があるとき、それを英文 化します。( translating to English )

それで調べてみます。

例えば Qt っていうやつで Windows API でいう EDIT を使いたい場合、Javaとかでは TextBoxって呼ばれているみたいです。
なので "EDIT" or "TextBox", "Text" 関係を探し出す。

すると QLineEdit, QTextEdit っていうのが見つかりました。で、documentationの「何するものか」的な項目を読むと
QLineEdit -> 一行のテキストボックス
QTextEdit -> 複数行のテキストボックス
...

っていう風に違うみたいです。
で、やりたいことがパスワード入力等のような場合は一行程度でいいので QLineEditを使えばいいということがわかる。

で、パスワードを入力するときってこういうteratailみたいなサイトでも ●●● って表示されますよね。
なんかこれに相当する操作があるはず。
ってことでメンバ関数 ( メソッド ) を調べてみる。

すると setEchoModeメンバ関数っていうのがあるみたいなのでそれで行う...とかですね。

そういう風にして調べていく。で、処理内容的には持っていそう ( 例えば QLineEditとかなら "表示文字列を変更する"等 ) でもそのクラスにないなら、親クラスやインターフェースを探す。

Javaなら

Interface <- Child1 <- ChildChild2

みたいになっていた気がします。
こういう風になっているなら、ChildChild2は Child1を継承しています。なのでChild1 を探す。
それでも見つからない場合は Interface から探す...
みたいに。

Javaのdocumentationの一部

投稿2018/10/12 01:57

BeatStar

総合スコア4962

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

manzyun

2018/10/12 02:23

やりたい処理を英文化してドキュメントにあたり易くするというのは良さそうですね! 具体的なドキュメントの調べ方を書いていただき、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問