Vapor Trail

明るく楽しく元気よく

『Head First オブジェクト指向設計』第5章 後半

第5章 後半 良い設計=柔軟なソフトウェア

柔軟ではないコードに対処する

アプリケーションの変更時に問題が発生するのは、ソフトウェアの柔軟性が足りないから。「凝集度」を高めて結合の問題を解決する。

・凝集度と結合度
設計におけるオブジェクトの責務分配に有効なものさし -凝集度と結合度-

問題点

現在の設計

楽器を追加するたびに新しいクラスを作成しなければいけない。

Instrumentクラス(楽器)は概念であり抽象クラスにするべきであるため楽器の種類ごとにサブクラスが必要になる。 またそれぞれの楽器はプロパティをInstrumentSpec(楽器仕様)のサブクラスで表すため、楽器ごとに~Specクラスが必要になる。 これらははじめは良い設計のように思えたが、楽器の種類を追加するたびに新しい仕様クラスを追加するため、あまり仕事をしない大量のクラスが作られることになる。その結果変更が困難になる。

楽器ごとに振る舞いは変わらないのでサブクラスにする必要はなかった。

設計上の間違った決断を正す

  • 自分の設計における間違いを消し去ることは難しい
    楽器の種類ごとにInstrumentのサブクラスを作ることに意味はなかったが、そのときには意味があるように思えた。
    実際に動作しているものを変更することは難しいが、設計が改善されれば長期的には時間が節約される。

設計はイテレーティブであり、他のプログラマーから受け継いだ設計だけでなく、自分で行った設計も、必要に応じて変更できなければいけません。

  • 変更点
    • 楽器固有のサブクラスの削除
    • 楽器が追加されるたびに新しいプロパティをInstrumentSpecに追加しなくてすむように、楽器のプロパティを動的に追加できるように変更。

設計の見直しによって
新しい楽器を追加するたびにサブクラスを作る必要はなく、「製造年」でも検索できるようにしたいと言われても、コードを変更する必要はなくなった。

どうすれば設計が上達するのか

ソフトウェア設計の上達には、実際にソフトウェアを作成することが一番です。GuitarやMandolinクラスを追加するなどの、間違った道に何度も迷い込まないと、行うべき正しいことには気づきませんでした。たいていのよい設計は、悪い設計を経て誕生します。最初から正しい人はほとんどいません。したがって、意味のあることをひたすら行い、オブジェクト指向の原則やパターンを適用して、今まで行ったことを改善できるか確認していくしかないのです。
『Head First オブジェクト指向設計』p255

凝集度

凝集度は、単一のモジュール、クラス、オブジェクトの要素間における接続の程度を測定する。ソフトウェアの凝集度が高ければ、アプリケーション内の各クラスの責務が明確に定義され、関連付けられている。そして、各クラスは特定された密接に関連するアクションを実行する。

  • 「高凝集のクラスは1つのことをとてもよく行い、他のことを行おうとはしない。」
    • 高凝集のクラスは特定の作業にだけ集中する。
    • すべてのメソッドがクラスの名称と関連しているか。場違いに思えるメソッドがあれば、他のクラスに移したほうがよい。
    • 高凝集・低結合は、オブジェクトが相互に依存していないため拡張や分割、再利用が容易なソフトウェアにつながる。

良い設計の目標は、高凝集度・疎結合なソフトウェア

  • よい設計のソフトウェアは変更と拡張が容易である。
  • カプセル化や継承などのオブジェクト指向の基本原則を用いて、ソフトウェアの柔軟性を高める。
  • 設計が柔軟でなければ、変更せよ。変更しなければいけないのが自分の設計であっても、悪い設計をそのままにしておいてはいけない。
  • クラスが高凝集であるようにする。どのクラスも1つのことを本当によく行うことに特化させる。
  • ソフトウェア設計のライフサイクル全体を通して、凝集度を高めることに常に務める。

Ubuntuの入力言語(英語入力・日本語入力)の切り替えをWindowsのようにCtrl+Shiftで行う

英語キーボードの場合、半角/全角ボタンがないので、英語入力と日本語入力の切り替えを任意のキーでバインドすることになると思います。
Windowsを使用しているときは入力言語の切換をCtrl+Shiftで行っていましたが、Ubuntuの場合デフォルトでSuper(Windowsキー)+Spaceで入力言語の切換を行います。

f:id:kyamashiro:20190815184145j:plain

設定→デバイス→キーボード入力ソースを切り替えるCtrl+Shiftを設定しようとしても設定できません。

f:id:kyamashiro:20190815181117p:plain

dconfエディターで設定しても適用できません。

f:id:kyamashiro:20190815183348p:plain

GNOME-Tweaksのインストール

$ sudo apt-get install gnome-tweaks
$ gnome-tweaks

キーボードとマウス→追加のレイアウトオプション→Switching to another layout

f:id:kyamashiro:20190815184503p:plain

Ctrl + Shiftにチェックをつけると、入力言語の切換ができるようになります。

askubuntu.com

*(2020-06-30)追記 今までCtrl+Shiftでしたが、IDEのショートカットコマンドとバッティングしてうまく動作しないことがあるので右Altキーで入力言語を切り替えるのがおすすめです。

UbuntuでHeidiSQLを動かす

追記(2020-04-15)

wine-5.0のインストールがうまく行かないのでこちらのページを参考にしてください。

marmooo.blogspot.com


今までDBのGUIツールとしてHeidiSQLを使用していましたが、HeidiSQLはWindows専用なのでLinuxでは使うことができません。 Linuxで使用できるDBのGUIツールとして、DBeaverMySQL Workbench が有名なので、両方のソフトを試してみましたがHeidiSQLと比べるといまいち直感的に操作しづらいなぁと感じてしまいました。

色々調べるとWineというソフトを使えばLinuxでもWindowsのアプリケーションを動かせるようなので試してみました。 よく見てみると、HeidiSQLのダウンロードページにも、

HeidiSQL runs fine on Windows XP, Vista, 7, 8 and 10. Using Wine, it mostly runs fine on Linux and MacOS.

Wineを使えばLinuxMacOSでも動くよと書いてあります。

Wineのインストール

wiki.winehq.org

$ sudo dpkg --add-architecture i386 
$ wget -nc https://dl.winehq.org/wine-builds/winehq.key
$ sudo apt-key add winehq.key
$ sudo apt-add-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ bionic main'
$ sudo apt update
$ sudo apt install --install-recommends winehq-stable
$ wine --version
wine-4.0.1

公式のページ通りにコマンド打つだけですんなりインストールできました。

文字化けを治す

winecfgと打つと設定画面になりますが、ところどころ日本語が□□□□□となってしいます。

$ sudo apt install -y winetricks
$ winetricks 

Select the default wineprefixInstall a fontcjkfontsと選んでフォントをインストールします。

フォントの変更

フォントを変えたい場合は、ホームディレクトリに.wineディレクトリがあるので~/.wine/drive_c/windows/Fontsに好きなフォントをコピーして~/.wine/user.regのMS系のフォントを変えれば変更されました。

[Software\\Wine\\Fonts\\Replacements] 1565312777
#time=1d54e4ea5dfb524
"Arial Unicode MS"="Unifont"
"Batang"="Baekmuk Batang"
"BatangChe"="Baekmuk Batang"
"DFKai-SB"="WenQuanYi Micro Hei"
"Dotum"="Baekmuk Dotum"
"DotumChe"="Baekmuk Dotum"
"FangSong"="WenQuanYi Micro Hei"
"Gulim"="Baekmuk Gulim"
"GulimChe"="Baekmuk Gulim"
"KaiTi"="WenQuanYi Micro Hei"
"Meiryo"="VL Gothic"
"Meiryo UI"="VL Gothic"
"Microsoft JhengHei"="WenQuanYi Micro Hei"
"Microsoft YaHei"="WenQuanYi Micro Hei"
"MingLiU"="WenQuanYi Micro Hei"
"MS Gothic"="TakaoGothic"
"MS Mincho"="TakaoMincho"
"MS PGothic"="TakaoPGothic"
"MS PMincho"="TakaoPMincho"
"MS UI Gothic"="TakaoGothic"
"NSimSun"="WenQuanYi Micro Hei"
"PMingLiU"="WenQuanYi Micro Hei"
"SimHei"="WenQuanYi Micro Hei"
"SimKai"="WenQuanYi Micro Hei"
"SimSun"="WenQuanYi Micro Hei"
"\x30e1\x30a4\x30ea\x30aa"="VL Gothic"

MS系のフォントをVL Gothicに変えたら、多少見た目がマシになった気がします。

"MS Gothic"="VL Gothic"
"MS Mincho"="VL Gothic"
"MS PGothic"="VL PGothic"
"MS PMincho"="VL PGothic"
"MS UI Gothic"="VL Gothic"

HeidiSQLのインストール

exeファイルをダウンロード・クリックしてインストールするだけで使えるようになります。 f:id:kyamashiro:20190809110739p:plain

アプリケーションの対応表

Wineの公式ページでWindowsアプリケーションが動作するのか、Platinum・Gold・Silver・Garbageとレーティングで確認できます。 HeidiSQLのver10.1はGoldの評価です。 appdb.winehq.org f:id:kyamashiro:20190809111812p:plain

他にもSourceTreeをインストールしようとしましたが、レーティングでGarbageとなっているようにエラーが出て正常に動作しませんでした。
WineHQ - SourceTree

参考

winetricksによるWineの文字化け(アルファベットが豆腐)を解消 - Symfoware
LinuxでWindowsアプリケーションを動かしたい人のためのWineの設定 - Just $ A sandbox