スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ちょっとモジュール指向について語りたかったけれど途中で面倒になった編。

あいやのオブジェクト指向



オブジェクト指向ってなんでしょう。
だれか分かる人教えてください。

------------------------------------------------
イベントが起きた時に発生するアクションAを持つモジュールクラス「Actionクラス」から
さらに派生してアクションAが起きた場合にファイルの破棄を行いたい。
その操作を持つモジュール「FileControlクラス」を作る時とかに [[ 18:11]]
-------------------------------------------------
オブジェクト指向ってモジュール指向なんですか?
うーん、どうなんだろ難しい。 [[ 18:28]]
-------------------------------------------------
その時にActionクラスはFileControlクラスのインスタンスをメンバレベル持たなければいけなくなる(必ずしもってわけじゃないけど)。
その[Action -> FileControl]な関係を「コンポジット」っていうんですよね?
よね? [[ 18:13]]
-------------------------------------------------
JavaScriptは「オブジェクト指向であってクラス指向でない」との声もあるし(僕もそう思う)、
オブジェクト指向 is 何。 [[ 18:29]]
-------------------------------------------------


うーん、記事は書いてみたもののオブジェクト指向が何物なのか…
実は私も掴めていません。

ってことでちょっと僕が考える
オブジェクト指向に則った「モジュール指向」について独白していきます。

まず設計段階から考えていきます。
このプロジェクトは「洗濯機」のプロジェクトです。

------------------
| 洗濯機クラス |
------------------

そして洗濯機には「洗濯する機能」があります。

------------------
| 洗濯機クラス |
------------------
| 洗濯() : void |
------------------

じゃあ洗濯するときには # テキストはここで途切れている。
スポンサーサイト

Cのダブルポインターについて何か語っているのをまとめたようだけど、もう昔のものすぎてそのまま記事に投稿しておこうと思った。


-------------------------------------------------------------------
aiya_000 : /*** Warning ***/
// デバッグ中についったーはやめましょう。 [[ 19:13]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : いた。
http://t.co/wWY4OOebDh [[ 19:46]]
-------------------------------------------------------------------
aiya_000 : こういうことか。
http://t.co/HuNRlQEiiq [[ 19:52]]
-------------------------------------------------------------------
aiya_000 : 結果。
http://t.co/eRZx09Tl0A [[ 19:52]]
-------------------------------------------------------------------
aiya_000 : ああ、ダブルポインタな。
http://t.co/nJZQzHr0Mn [[ 19:56]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : …なんで?
char* str;

void func(char* str){ str = "aaa"; }
に渡したらなぜおかしくなる?
func(str);
printf("%s\n", str); // おかしい。 [[ 19:58]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : あー、メモリ確保してないじゃん。
…それでおかしくなるの…? [[ 19:59]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : えー、確かにchar*に何かを装填したいならchar*ポインタ(char**)を渡すのが当然だけど、
なにか腑に落ちない。 [[ 20:02]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : std::stringの場合(戻り値で戻せとかは考えないで)、
void func(std::string* str){ *str = "aaa"; }
std::string str; func(&str);
が普通だけどさ…うーん? [[ 20:03]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : char* str;で
メモリ領域xにstrをsizeof(char*)分確保する。 [[ 20:04]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : func(str);

メモリ領域xを…あーっ!!! [[ 20:05]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : ないじゃん。
メモリ領域xの参照先アドレスないじゃん。
結果的にfunc関数には壊れた参照先アドレスbが渡るじゃん。
あーーーっ!!わほーーいっ!!! [[ 20:06]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : void func(char**);
だと [[ 20:07]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : char* str;でsizeof(char*)を確保、
func(&str);でアドレスxをchar**に渡す。 [[ 20:07]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : で、間接アクセス演算子にて
str(char*)に参照先アドレスを格納する。
例えば
void func(char** str){ *str = "aaa"; }
char* str; func(&str);
ならデータ層のアドレスa("aaa"の先頭アドレス)が格納される。 [[ 20:09]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : あーうっ。 [[ 20:09]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : C++って型安全だねっ!?
多分char** str;とchar* str[X];を違う型だと判断してる。 [[ 20:12]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : そして襲い来るセグメント違反!!
楽しい!!! [[ 20:13]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : やっほーいできたあっ!!!
const unsigned char*からconst char*へのキャストっ!!
さすが再解釈キャストだっ!!
http://t.co/mDyM19E89k [[ 20:52]]
---------------------------------------------------------------------------------------------------------------------------------------------

編集環境のすすめ[screen + VimShell + Vimタブ機能](ただし最近tmuxに変えたりしたので未完成記事編)

[screen + VimShell + Vimタブ機能]のすすめ
 現在私のターミナル環境は
GnomeTerminal(Ubuntu) -> screen + vim
で運用しています。

 この記事には以下の方々に効能があります。
・各プログラミング言語(各分野)の作業を同時に行う
・screenの複数ターミナルじゃもの足りない ( Prefix + c )
・既存の環境に刺激が欲しい

なお、筆者Vim使いのためVim前提で話をすすめますが、
Emacserの方々にはeshellや
tabbar.el等のプラグインで読み替えることが可能かと思います。


インストールが推奨されるソフトウェア
Vundle(Vimプラグインを統括管理)
VimShell

インストールが必要なもの
GNU screen
・Vim


 私はしばしばC++を書きながらツイッターをしつつHaskellを学んでみたり
ソフトウェアのインストールをしながらワークログを書いて、
関数電卓の代わりにJavaコードで計算したり…ということをします。

 でもその時にscreenの複数ターミナルを開く機能ではもの足りない場合があるのですよね…。
なぜなら

「いちいち各言語ごとにいくつもターミナルを開いているとターミナルがいっぱいになるから」

!!

ですのでもっとコンパクトでスマートにできないかと思っていました。


// 以下、記事書き途中。
// この記事書くの放置してた間にscreenからtmux派になった。

VimShellCreate
欠点
gccとかでコンパイルとかすると、コンパイルエラーが血のように赤くそして激しく降り注ぐのでこわい。 # テキストはここで途切れている。

Vim編集スタイル(ただし編集スタイルとかもうこの記事書き溜めてから既に変わってしまったので未完成編)

Vim編集スタイル


ここでは
例: Ctrl+oをC-o
aもしくはbもしくはcのことを[abc]
と記述していきます。

私のVimスタイル
インサートモードでのカーソル移動は基本C-o + [hjkl]
またはC-o + (数字)Gで行ジャンプ
そしてC-o + [IA] や C-o + (数字)[webWEB]
で行っています。

ノーマルモードを使う場面としては、
ソースコードを閲覧したりする場合になります。

同ソースコードの離れた別の行を見たいけど
カーソルはここから動かしたくない。
その場合は:spもしくは:vspと打ってから分割した片方のバッファで移動します。
こうすることでもう片方は移動せずに他の場所を閲覧することができます。
(ただし画面占領幅は半分になってしまいますが。)

統合開発環境のようにファイルを複数開いていたい、
エクスプローラを使いたい。
そんな場合はVimShellを導入して:sp、:resize -10、:VimShellCreate。
上部分のVimShellをエクスプローラ、下の大きい方をその他用に使っています。
VimShellはノーマルモードに戻ることなくシェル上で
vimshell% :Command
とすることでVimコマンドを実行することができます。

また、VimShellでの「vim」コマンドは自動的にtabnewをして開いてくれるエイリアスをかけています(.vimshrc)。

っていうのをgif画像付きで紹介したい。 # テキストはここで途切れている。

bashをかわいく(ちょっとだけ編)

こんなん作った。



function fakeUser() { #{{{
PS1="\[\e]0;\w\a\]\n\[\e[32m\](*^-^)</${1}/ \[\e[33m\]\w\[\e[0m\]$ "
} #}}}
export PS1="\[\e]0;\w\a\]\n\[\e[32m\](*^-^)</\[\e[33m\]\u\[\e[32m\]/ \[\e[33m\]\w\[\e[0m\]$ "


Screenshot_from_2014-06-14 23:00:30

(*^-^) < vimshell-kawaii.vimにプルリクしました。

[%] (*^-^)
vimshell% echo '今回はですね、えっと'
今回はですね、えっと
[%] (*^-^)
vimshell% echo 'なんと、あのももんが氏のgithubリポジトリに'
なんと、あのももんが氏のgithubリポジトリに
[%] (*^-')/~
vimshell% echo 'あ、かわいい。'
あ、かわいい。
[%] (*^-^)
vimshell% echo 'そうそう、あのももんが氏のリポジトリに'
そうそう、あのももんが氏のリポジトリに
[%] (*^-^)
vimshell% echo 'Pull Requestをしてみました!!'
Pull Requestをしてみました!!
[%] (*^-^)
vimshell% echo

[%] (*^-^)
vimshell% echo 'あいや、初めてのプルリク編。'
あいや、初めてのプルリク編。
[%] (*^-^)
vimshell% echo '内容省略'
内容省略
[%] (*^-^)
vimshell% echo 'なおこの記事は'
なおこの記事は
[%] (*^-^)
vimshell% echo 'http://github.com/Shougo/vimshell.vim'
http://github.com/Shougo/vimshell.vim
[%] (*^-^)
vimshell% echo 'http://github.com/supermomonga/vimshell-kawaii.vim'
http://github.com/supermomonga/vimshell-kawaii.vim
[%] (*^-^)
vimshell% echo 'のみで書かれました!!!'
のみで書かれました!!!(ほんとはちょっと手直ししました。)
[%] (*^-^)
vimshell% echo 'すごい(かなり)'
すごい(かなり)
[%] (*^-^)
vimshell% echo '。'

[%] (*^-^)
vimshell% echo 'ぼくのりぽじとり。。。'
ぼくのりぽじとり。。。
[%] (*^-^)
vimshell% echo 'http://github.com/aiya000/vimshell-kawaii.vim'
http://github.com/aiya000/vimshell-kawaii.vim
[%] (*^-^)
vimshell% echo '変なコミットメッセージが一つ入ってるのはですね、'
変なコミットメッセージが一つ入ってるのはですね、
[%] (*^-^)
vimshell% echo 'ぼくが[git commit -m "hogehoge !!"]とか打ってしまったからです!!'
ぼくが[git commit -m "hogehoge !!"]とか打ってしまったからです!!
[%] (*^-^)
vimshell% echo 'ほら、vimshell-kawaii-smileyちゃんも微妙な笑みを浮かべているよ。'
ほら、vimshell-kawaii-smileyちゃんも微妙な笑みを浮かべているよ。
[%] (*^-^)
vimshell% echo 'ではそんなところで'
ではそんなところで
[%] (*^-^)
vimshell% echo 'じゃあのっ!!'
じゃあのっ!!
[%] (*^-^)
vimshell% echo 'http://blog-imgs-66.fc2.com/g/c/c/gcc0aiya000/Screenshot_VKawaii.png'
http://blog-imgs-66.fc2.com/g/c/c/gcc0aiya000/Screenshot_VKawaii.png
vimshell-kawaii

[%] (*^-^)
vimshell% echo 'vimshell作者のShougo氏とvimshell-kawaiiのももんが氏に感謝!'
vimshell作者のShougo氏とvimshell-kawaiiのももんが氏に感謝!
[%] (*^-^)
vimshell% echo smiley!
smiley!
[%] (*^-^)
vimshell% echo ...smiley!!
...smiley!!
[%] (*^-^)
vimshell% echo こっちむいてsmiley!!
こっちむいてsmiley!!
[%] (*^-^)
vimshell% echo /~~
/~~
[%] (*^-^)
vimshell% echo /~~
/~~
[%] (*^-^)
vimshell% echo /~~
/~~
[%] (*^-')/~
vimshell% echo 'あ、こっち見てくれた。'
あ、こっち見てくれた。
[%] (*^-^)
vimshell% echo 'vimshell-kawaiiたんはかわいいです。'
vimshell-kawaiiたんはかわいいです。
[%] (*^-^)
vimshell% echo 'どうかsmileyたんを可愛がって上げてください。'
どうかsmileyたんを可愛がって上げてください。
[%] (*^-^)
vimshell% echo 'じゃあのー。'
じゃあのー。
[%] (*^-^)
vimshell%
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。