自己啓発マン  2020/12/18更新

JPIN#3


文字と文字列

javaには文字と文字列の二つがある

文字は一文字のみ

文字列は一文字の集合体

以下が書き方である

char c = '3'; //3という数字を数字として変数cに代入

String str = "12345"; // char型の配列であるので数字として代入する

※この二つに互換性なし


加算演算子の使用

加算演算子を使うことで文字を連結することができる

文字連結・・・文字列と文字列を足算することができる

String str ="abc" + "def"

とすると"abcdef"となる


String st ="abc" + 1 + 2;

上記の計算結果は"abc12"となる

これは右辺の動きが次のようになっている

"abc"+1+2 → "abc" + "1" +2 → "abc1" + 2 →"abc1" + "2" → "abc12"

順番にjavaが変換してくれている こいつ空気読めるやん


ただString st = 1 + 2 + "abc";

の結果は 3abc  となる

この場合は1と2は数値として読み取られる

ここは空気読めんのかい


数字と数値

次のようにint型で数字を出力できない

int num ="100"  →エラーでる

どうしても出力したい場合は以下のようにうつ

int num = Integer.parseInt("100");

こうすれば数値を数字に変換してくれる


設計手法

設計手法の一つである

分割と結合を考える

できるだけ分割することで作業の効率化を行う

コストはイニシャルコストとランニングコストがかかる

ソフトでは開発コスト(工数とか)と保守コスト(updateとか)にあたる

この二つは相反関係にあるのでプロジェクトによってどっちが重要か考える→CEOの仕事(日本じゃこの立ち位置が明確にない)


構造化

設計手法の一つである

UI→イベント→データアクセス→イベント→UI→イベント・・・

kこれはUIを起点にイベントとデータアクセスが稼働する

しかしUIが一番いじられる可能性がある

なので仕様変更が多い設計には弱い(デメリット)

逆にUIの流れは業務の流れと同じなのでUIの設計はわかりやすい(メリット)

これが構造化(Outside In principle)という


オブジェクト指向

いろんな種類

まずオブジェクト指向といっても似たような言葉が多い

OO(object oriented)→設計の考え方

OOP(object oriented programing)→設計の手法

OOPL(object oriented programing language)→ OOPを取り入れた言語(他の言語もある)

この3種類がいる


どんなもの?

データアクセスの設計をメインで考えて設計することがオブジェクト指向

考えづらいがその分UIの設計変更に強い

よって開発コストは多くかかるが保守コストは安くすむ


新規Pはヒットするかわからない、保守管理がどれほどかかるかも未知数、

何もかもが分からないので基本的には開発コストを下げて売るのが一般的であるので 構造化でPは設計される

逆にこれまであったようなPを設計する場合、需要がある程度確立されているので 保守管理が比較的多くする必要がでてくる

その場合保守管理費を安くしたいのでオブジェクト指向で設計する



設計手法で考えなければいけないこと

1.どんな処理するのか

2.どんなデータを扱うのか

この二つを考えることが重要である

1から2を考えるが構造化(outside in principle)

2から1を考えるのオブジェクト指向(inside in principle)


オブジェクト指向の基本4原則

カプセル化

問題領域を解決するデータの種類と関係性を明らかにする必要がある

この中で以下の条件が変更に強い最低条件である

・その中で変更の影響範囲がすぐに特定することが重要

・変更作業が楽である

扱うデータの意味がわかるようにする必要がある!

そしてそれぞれのデータの関連性がわかるようにする必要がある

すると見る側からしたらわかりやすく、データに変更や不具合があったら特定しやすくなる!

関係ないものはなるべくいれない!

このように関係するデータをまとめることをカプセル化という


データ隠蔽

このカプセル化を維持するためにはあるオブジェクトが他のオブジェクトの内部にあるデータに干渉しなくていいようにする必要がある

これがデータ隠蔽である

javaではメソッドの前に"private"と入れると情報は非公開となるので外からデータを見ることができなくなる

ちなみに公開するには”public”でする


情報隠蔽

カプセルの中にあるデータに何が入っているか確認しなくていいようにすることである

あるカプセルの内容を使いたいなとなったら表面的な値のみを参照できるようにして 内部のデータまで見る必要をなくす

これによって他からの干渉を減らすことができる

それが情報隠蔽である


抽象化

オブジェクトをカプセル化して情報隠蔽するにはある程度関連する項目ごとにブロックを構成する必要がある

ある内容に関連する項目をひとまとめにしていく

それをどんどん行っていきブロックを大きくかつ少なくしていく

そうすることで何かデータに異常や変更が発生した場合に どこを参照すればいいか分かりやすくなる

これを抽象化という


そして共通するブロックを何個も作り、そのブロックも他の共通するブロックと共通するブロックを作る・・・これでブロックを大きく、少なくすることで連結が容易にわかりやすくなる

共有サーバーのデータ管理に似ている


OOでオブジェクトと呼んでいたものはOOPではクラスとインスタンスになる

クラス:オブジェクトの定義情報

インスタンス:クラスから定義をコピーしたもの+値

①使われる側のプログラムの定義を決める

②インスタンス生成(①の定義をコピーして値を与える)

③実際に使うためのコードを書く

この順番で作っていく


ヒープ領域

スタック領域において多くのデータのコピーを他のメソッドに渡したいときスタック領域のメモリ領域に

そのまま映すと非常に時間がかかるし負荷もかかる

そこで渡したいメソッドをある領域にコピーする

その領域内に保存したメソッドの場所(アドレス)をスタック領域にコピーする

この時にメソッドを保存した領域をヒープ領域という

javaにおけるヒープ領域の使い方は以下である

A b =new A(); // クラスAをヒープ領域にコピーして変数bにそのアドレスを渡す

b.name="hello"; //変数bに書いているもの、つまりクラスAにあるname変数に"hello"を代入

b.sayHello; //変数bに書いてあるもの、つまりクラスAにあるsayHelloを実行する

このようにすることで膨大なデータ量のクラスAの一部しかメモリに使わないで使用することができる

しかし上記ではオブジェクト指向で述べた情報隠蔽ができていない

そこでクラスAにはprivadeクラスにする

そして引数として情報を相手に渡せるようにすることで情報隠蔽が可能である

ここでprivateにした場合、java言語ではある命令文を加える必要がある

それが

getName 「メソッド」・・・自分のネームフィールドの値をコピーとして返す

setName 「メソッド」・・・引数を受け取ってその引数を自分のコードに入れる


フィールド→ソース→ゲットアンドセットアンズ

アクセサメソッド


大事なこと

長年にわたって運用されるものを作るものが重要!!

どんなふうに作ったのかなぜその形にしたのか考えることが重要!!



タイトルとURLをコピーしました