仕事と勉強
社会人になると勉強する時間がなかなか取れませんのでひと工夫必要になります
<アプローチの工夫>
ボトムアップでなくアップダウンでやる
目的の作業を行う為に必要な知識を学ぶ
今回の汎用画面APであればリソース管理、DBアクセス、UMLが対象になる
<普段の工夫>
生活のリズムを作る
1.家を出る⇒電車内で勉強
2.退社⇒電車
3.筋トレ⇒夕食
4.風呂上がり⇒ビール片手に本を読む
5.日記⇒就寝
<ポイント>
毎日必ず、5〜10分で良いのでやる
週に一度は休む
<動機の工夫>
やる事で小遣い稼ぎになる
⇒イベントを企画、フリマ向けの商品作り、アフィリエイト(やった事を書き続ける)、副業のアイデアを練る...etc
javaとc++ のクラス実装比較
ここで、少し休憩がてらに作成した
javaのHumanクラスとc++ のHumanクラスを比較して見たいと思います。
<java>
Javaではコンストラクタ、フィールドメソッドと定義して実行
特に、メモリとかオブジェクトのインスタンスを気にしないで作れます
<c++ >
値の返却方法、ポインタなどインスタンスからオブジェクトの振る舞いなどを考慮に入れて作成しました。
Javaではoperator演算子のオーバーライドができません。
そして、名前空間の定義方法も違います
javaの場合はパッケージとディレクトリ構成が同じにならないとエラーになる
c++ の場合は別になっている
結論的に、c++ の方が複雑⇒自由度が高い javaは細かいところは気にせず実装出来る…
そんな印象を受けました。
フレームワークなどはオープンソースでたくさん手に入るJavaに軍配が上がりました。
JavaでもC++の様にリソース(インスタンス、オブジェクトなど)を考慮に入れた実装を心がけないといけないなぁ...と反省しました。
次回からはQtを使用して「汎用画面AP」の実装に着手したいと思います。
operator演算子2 "+="の実装
前回学んだ「operator演算子」には「++, --」以外にも「=, !=, +, -, <, >」など使用可能
ただし倫理演算子(&&, || など倫理演算を行う)は使用しない方が良いらしい原因は
「組み込み倫理演算子とクラス型の倫理演算子は一致させることができない」から...
と参考にしている本に書いてありました。
時間の都合で、「フレンド関数」まで届かなかったのでoperator演算子2をやります
<実装>
human += 10と処理を記述可能になる
<Mainクラス>
ヘッダーファイルには
Human& Human::operator +=(int year);
の様に定義しいる、あくまで「参照を返却する」のでその様に実装してやらないと
ハマる、コンパイルエラーが残っていたりして時間がかかってしまった。
本当は、フレンド関数まで記載したかったが届かなかった。。。
次は、休憩してJavaとC++で作成したHumanクラスの比較を行います。
operator演算子の使い方
前回の「C++による、コンストラクタの種類」に引き続き、
オペレーター演算子の使い方を学びます。
operator演算子は下記の様な実装を可能にする演算子です。
「++, --』を使用可能にする。下のは++を実装可能にした形です。
「Human human('z');」 ○「++human;」×「human++;」
あと起き演算子は未定義でエラー
後置きの演算子を定義
human++;のヘッダーファイル定義
同様にソースファイルへの定義
実行結果
前置き(after1)と後置き(after)の出力結果
<詰まったところ>
前置きと後置きの違いはインクリメント(演算)を行った後に「this」参照を返却するのと
演算後に「this」本体を返却するという違いがあった。ので式の内容も違う。
ここになかなか気づかなかった。。。
次回は、「フレンド関数 続operator演算子」について学習します。
C++による、コンストラクタの種類
前回のC++実装に引き続き、C++の勉強を続けます。
C++によるコンストラクタには以下の様な種類がありました。
・デフォルトコンストラクタ:Javaでのデフォルトコンストラクタと同義
・変換コンストラクタ:コンストラクタに引数を渡し初期値を設定します。
1. void クラス名::クラス名(引数...) (int num, char* ch)など...
2.変換コンストラクタ(前回のソースの引数ありの部分)
単一の引数nameを初期化する
呼び出し方は、 Human human('z') の様になります。
そして次の様にも呼び出せます。Human human = 'z';
※これは知りませんでした。。。
そして「operator」演算子!!変換関数と呼ばれるものがあります。
実際の処理では、ここで年齢をします「age」ではなく他の値でも良い
他のロジックを、アルゴリズムを作成する可能性を持っていると思います。
次回は、「operator演算子」について学ぼうと思います。
C++でのクラス作成方法
前回、色々とやってみたもののC++での実装ができなかったので勉強しました(笑)
まずはできたソースコード一式をみてください。
<ディレクトリ構成>
Java : 「prac.java = Mainクラス, prac.java.base =Humanクラス」
C++ : 「階層なし」だけど
名前空間は「prac::clang = Mainクラス ,prac::clang = Humanクラス」
フィールドが一つだけ
起動結果↓
Humanクラスのhello()を呼び出す
※Javaとの実装の違いが結構あります。フィールドの数が違う(Stringがcharに...)
名前空間の解決に至るまで時間がかかりました。。。
<わかったこと>
javaでの考え方に名前空間はありますが、パッケージングとディレクトリ構成がセットになっています。
なのでC++での実装はソースファイルが同じディレクトリにあるのに名前空間の設定が成立しています。
Javaの場合はeclipse上だと分かりづらいですが、パッケージと同じディレクトリ構成が出来上がっています。
なのでC++の実装もそんな風にディレクトリ構成を変えてみました。
prac::clang(/prac/clang/Cmain.cpp), prac::clang::Human.cpp
因みにC++ではヘッダファイル(*.h)とソースファイル(*.cpp)に分けて作成します。
<ヘッダーファイル>
<ソースファイル>
<作成物のクラス図>
<作成するのについまずいた所>
やった事「プロジェクト作成をして何もわからないうちにパッケージ切ったら...」
「symbol not found for architecture x86 64」エラーでつまづく
解決策→プロジェクトを始めから作り直した
原因と思しき...
1.プロジェクトに「src/」フォルダがなかった
2.名前空間の指定が不適切だった
3.ヘッダファイルで名前空間を指定する→ソースファイルにも名前空間を指定する
Javaではヘッダーファイルがないので「なんか似た様なこと書くのだるいんだけど..」
となりがちですが、設計性に秀でた実装方法だと思います。
「どこが?」と思う人もいるかもしれませんが
次回自分なりの実装になりますが検証してみようと思います。
は、引き続きC++の勉強を続けようと思います。
関連ページ
Eclipse セットアップ
- Java Install Eclipse〜開発ツールのインストール〜
- TensorFlow C++環境〜EclipseにCDTをインストール〜
- Setup OpenGL with Java〜JOGLを使う準備 for Eclipse〜
- Eclipse Meven 開発手順〜プロジェクトの作成〜
- Java OpenCV 環境セットアップ(on Mac)
- Eclipse SceneBuilderを追加する
- JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~
C++でのHello World 〜EclipseでのC++実装その1〜
今回は、C++でのハローワールドを実装します。使用するIDEはEclipseです。EclipseにC++プラグインを突っ込みます。
Eclipseインストール
前回はUMLの作成をして各クラスの関連を示しました。
今度は、「DbアクセスInterface」から先のDBアクセスに関して
動的に処理を行いたいのでオブジェクト指向プログラミングの「ポリモーフィズム」を使用したい→筆者はC++でのプログラムが書けませんので勉強します。
ところで....
汎用画面APは、クロスプラットホームで起動する想定ですので(詳細は仕様を参照)
実装に使用するプログラム言語として「C++」と「Java」を候補にあげますが
自分自身がJavaの経験があるので「C++」を主軸にして話を進めようと思います。
まずは基本C++でのオブジェクト指向実装の方法を検証します。
基準は「Java」言語でのプログラムで各種フレームワークも参考にします。
初めは、やっぱりC++でもJavaでも「Hello World」でしょう(笑)
<Javaバージョン(Humanクラス使用)>
<C++バージョン(Humanクラス使用)>
名前空間の使い方がわからなかったため次回記載いたします。失敬(笑)
UMLの書き方 クラス図の記述
前回は、UML Designerの使い方をやりました。
UMLは何種かの図を使用して表現するシステムデザイン図、設計図です。
「ユースケース図」「クラス図」「シーケンス図」「コミュニケーション図」
「ステートマシン図」「アクティビティ図」「パッケージ図」「オブジェクト図」
「コンポーネント図」「配置図」「合成構造図」「タイミング図」「相互作用概念図」
と沢山あります。よく見かけるのは上記の打ち初めの3つです。
そして「クラス図」以下の様な形で表現いたします。
「汎用画面クラス」には以下のデータを保持している
・画面リスト:画面(機能)の名前をリストで保持する、起動APが変更する度に更新
・APリスト:起動できるアプリケーションのリスト、AP起動時に取得する
・画面コンテキスト:画面表示するためのプロパティを保持するコンテキストクラス
・画面表示タイプ:画面表示のタイプ、現状では3種類。設定ファイルの値で変更可能
・画面表示クラス:Qtで作成する画面クラス(画面タイプA~Cの3種類)
は「+」を示し「+画面リスト」は他クラスからもアクセスできる変数を示す
は「−」を示し「−画面リスト」は他クラスからはアクセスできない変数ことを示す
そして、は振る舞い、メソッドを示す。
「汎用画面AP」は「DBアクセスInterFace」と関連がある(呼び出す)
...とここまでが設計できています。
「DBアクセスInterFace」は設定ファイルからアクセスするDBのURIを読み込み
対象のDBサーバーへアクセス、データの取得、更新、削除、登録(CRUD)を行う。
以降、リモートとローカルDBへのアクセス(PostgreSQL, SqlLite)を切り替えて
EntityManagerの作成及びSQLクエリの発行を行う仕組みを考えるので
UMLの作成から一時的離れます。
次は、設計するためのクラス構成を考えるためのテスト実装をやります
UML Designerの使い方 チュートリアル
前回セットアップをしたので、今度こそUMLの書き方を学びます.... とはいえツールの使い方がわかないと話にならないので
ツールの使い方を勉強します。
<UML Designer getting started tutorial>を参考にチュートリアルをなぞります。
・まずは動画で見ると良い?
一言で「わかりやすかった」と言うより「そのまんま」だった。
例に習い、作図して見る
これはクラスの保持する変数(公開データ)
同様に非公開データ
を示します。
これはメソッドを示し、クラスの振る舞いを表します。
「画面コンテキスト」と繋げている線は関連を示します。
これらを繋げていきシステムの、アプリケーションの仕組みを描きます。
実際に使用するときには、「関連の線」とか依存とかのきめ細かなルールを設けて
やっているところもあるとは思うけれど、素直にノートをつけてやるとよりわかりやすいのではないでしょうか?
eclipse UML Designer クラス図の書き方
eclipse UML Designerでのクラス図の書き方 前回〜UMLセットアップ〜
UMLプロジェクトを作成は以下の様な手順で作成します。
1.プロジェクト作成〜パースペクティブを右クリック〜
2.「Other」を選択
3.「UML Project」を選択
4.「プロジェクト名を入力」し完了ボタンを押下
5.初期表示を確認する
今回は、クラス図を作成するので「Class diagram」をダブルクリックします
まず、作成するクラスの要件、機能一覧を決めておきます。※汎用画面APを作成します
今回のサンプルアプリケーション、汎用画面APは設定ファイルに登録した
アプリケーションを起動する。
なので、MainClassより処理が起動して各要件を満たすために必要な処理を実装する
そのためのデザインを組み上げる → 設計するのがUMLになります。
細かい定義は他のサイトを参照してください(笑)
次回は、UMLの書き方を記載いたします。