katapedia

コーディング

プログラミングの作業は、「私たちの奥深くに備わっている創造性の欲求を満たしてくれる」。また、「私たちが人間として共通に持っている感覚を楽しませてくれる」。そこには、5つの種類の喜びがある。

プログラミングの作業には、特別な苦悩が本来的に備わっている。

書くべきこと

コードにはHow

テストコードにはWhat

コミットログにはWhy

コードコメントにはWhy not

三大美徳

  1. 怠惰

  2. 短気

  3. 傲慢

プラスで礼儀正しさと敬意

稚拙な設計

• コードが重複しまくっている

• 条件分岐の密林があちこちにある

• どこに何が書いてあるかわからない

• 変更した時にどこで何が起きるか推測できない

• やっていることは解読できるが、なぜ、そこでそ の処理が必要か意味がわからない

• パッケージ名/クラス名/メソッド名/変数名/コメン トが嘘だらけ

• でも動いてる

良いコード

読みやすくて、理解しやすく、修正しやすいコード

良いコードにするには

シンプルは美しいか

シンプルな言語でソフトウェアを作ればソフトが複雑になり、逆にソフトをシンプルに記述するためには言語がその複雑さを負う必要がある。

これを「怠惰のための勤勉」とまつもとさんは表していた。手抜きをしては美しいコードを書くことは当然できない。でも、苦労を見せびらかす(表面に見えるようにする)のは粋じゃない。まさに水鳥。

「全てをシンプルにすること = 美しい」ということではない。Ruby が簡潔な表現ができると評価されるのは、Ruby 自身が複雑さを引き受けているからでもある。

使うことで使っている人を進化させるようなソフトウェア

Excel の表を見ながら電卓叩いている人を見ると、上手く最適化されていない気がする(その人にとってExcel の習得コストが高い*1)。

マスターするのは大変だけど、マスターすると進化につながるようなソフトが美しい。まつもとさんは自分のマシンのローマ字のキー配列をいじるコードを書いた。最初3日間くらいはまともに文字が打てなかったけど、今はいくら大量に文字をうっても腱鞘炎にならない。(怠惰のための勤勉)

美しいコード

ひどいコード

http://hitode909.hatenablog.com/entry/2016/02/08/140232

読みやすいコード

http://bufferings.hatenablog.com/entry/2017/11/01/215751

あっと驚かせるJavaプログラミング

http://qiita.com/tatesuke/items/36924274f043f37a391f

オブジェクト指向エクササイズ

  1. 1つのメソッドにつきインデントは1段階までにすること
  2. else 句を使用しないこと
  3. すべてのプリミティブ型と文字列型をラップすること
  4. 1行につきドットは1つまでにすること
  5. 名前を省略しないこと
  6. すべてのエンティティを小さくすること
  7. 1つのクラスにつきインスタンス変数は2つまでにすること
  8. ファーストクラスコレクションを使用すること
  9. Getter, Setter, プロパティを使用しないこと

レガシープログラマー

  1. 使われるローカル変数をすべてメソッドの最初に宣言する。
  2. ローカル変数の宣言時に空文字(““)や新しいオブジェクト(new Xxx())で初期化する。その後にすぐ別の値をセットする。
  3. メソッドの戻り値がすべて成功・失敗を表す 0 か -1 になっている。
  4. 複数のデータをまとめて扱う際は毎回配列を使う。配列の上限数はありえなさそうな数を指定する(1000とか)。
  5. 基本データ型(stringやint)と配列だけでデータ構造を表現しようとする。
  6. 変数の命名規則にハンガリアン記法*2を使う。
  7. クラスのフィールド変数をグローバル変数のように利用する。
  8. 配列やリストを毎回forループで処理する(例: for (int i = 0; i < array.Length; i++))。
  9. クラスやクラスメンバの可視性を意識していない(privateメソッドがpublicになっている等)。
  10. 変更履歴をコード中にコメントとして残す (ADDやDELみたいなコメントがたくさん付いている)。
  11. 変数名やメソッド名を何かと略したがる。

http://blog.jnito.com/entry/20110218/1297983647

糞コード

クソコードとは 読む人を怒りの渦に 叩きこむコードである

  1. 読めないコード –  変数名が暗号/制御フローが無駄に複雑/メソッド名と処理の 内容が合ってない etc…
  2. 要領の悪いコード –  言語レベルで用意されている機能を素直に使わない(例:Go を使っているのにゴルーチンを使わない) etc
  3. 意図がわからないコード –  フレームワークのレールに従っていない

開発環境に必要な機能

プログラミングテクニック

タブからスペース変換

sed -i -e "s/t/ /g" *

ホワイトスペース削除

sed -i -e "s/s*$//g" *

値オブジェクト

・ドメイン固有のString – PersonName, MailAddress, Telephone, …

・ドメイン固有のint/long/BigDecimal – Money, Quantity, Rate, …

・ドメイン固有のLocalDate – DueDate, ExpireDate, DateRange, … データの用途を明確にする

ソフトウェア

ソフトウェアのライフタイムにおけるコストは,その 80% が保守に費やされる.

ソフトウェアの保守が最初から最後まで元の作成者によって行われることは,ほとんどない.

コーディング規約は,ソフトウェアの可読性を向上し、エンジニアが初めて目にするコードをすばやく完全に理解できるようにする.

このため、この規約は名前付けやスタイルを中心としており、次の項目が含まれています。

関数規約

  1. 1関数内の有効行数は、75行以内とする。
  2. 1関数内のネストの深さは、5以内とする。
  3. 1関数内のサイクロマチック数は、20以内とする。
  4. 1関数内の分岐条件数は、20以内とする。
  5. 1関数内のパラメータ数は、3以内とする。

命名規約

https://codic.jp/

https://ferret-plus.com/4680

https://findy.jp/15270

関数命名規約

関数名でよく使われる英単語

productionとかdevelopmentとかtestとかstagingとかの環境変数にふさわしい名前

Tips

prefixとsuffix

suffixを使うことにする

MINIMUM_APPLE_COUNT (replace with APPLE_COUNT_MINIMUM).

https://hilton.org.uk/presentations/naming-guidelines

Doxygenコメント規約

よく使う英語

“プログラマが知るべき97のこと”:http://xn–97-273ae6a4irb6e2hsoiozc2g4b8082p.com/

プログラマがやってはいけない97のこと

プログラミング言語 記号比較

http://www.ne.jp/asahi/hishidama/home/tech/lang/symbol.html

共通項目

ヘルプ文

READMEに書くべき内容

https://yakst.com/ja/posts/3859

https://gist.github.com/rowanmanning/77f31b2392dda1b58674#file-readme-md

READMEじゃないけど大文字でルートに置くファイルたち

https://github.com/kmindi/special-files-in-repository-root/blob/master/README.md

リリースノート

バージョン番号

Util

プログラムエラー集

成熟度点検

長い一行の改行ルール

rubyでは長くても改行しないみたい

pythonは80文字ルールがある

参考

https://google-styleguide.googlecode.com/svn/trunk/javaguide.html#s4.5-line-wrapping

(1)=以外のオペレータの前で改行

(2)=のあとで改行

(3)(のあとで改行

(4),のあとで改行

(1) ローカル変数を利用

(2)カンマで改行

(3)優先度の低い演算子の前で改行,

基本方針:できるだけ上の行に続きっぽい感じで残す

基本方針:+とかーとかはできるだけ前にする。カンマとかは後ろにする。

1735   if define != ifndef:
1736     error(filename, 0, 'build/header_guard', 5,
1737           '#ifndef and #define don't match, suggested CPP variable is: %s' %
1738           cppvar)
1739     return

優先順位は以下のとおり

”+-*/ &”->”,”->”(“->”.%->”

http://www.triemax.com/products/jalopy/manual/wrapping.html

分岐

要件のIF

仕様のIF

実装のIF

要件のIFは、システムの外に元々存在しているもので本来要件として抽出が可能なもの(まぁ大抵は設計中に知るんだけどね)

仕様のIFは、システム開発のいろんな都合で追加されるもの。これが一番うざい

実装のIFは、プログラム的な都合で追加されるもの。大抵はnullで落ちるのを防いだり、ライブラリに正当な値を渡したり・・って為のもの

http://d.hatena.ne.jp/makotan/20081107#p3

例外

業務エラーでは、例外を利用してはいけない。

https://blogs.msdn.microsoft.com/nakama/2008/12/29/net-part-1/

参考

http://d.hatena.ne.jp/kmaebashi/20100114/p1

http://d.hatena.ne.jp/licheng/20130608/p1

http://blog.shin1x1.com/entry/application-throws-exception-or-not

エラーの分類

https://qiita.com/koher/items/a7a12e7e18d2bb7d8c77

Swiftのいけてる例外機構

https://qiita.com/omochimetaru/items/c30f7a021fb9b8f0fa92

ログ

http://gihyo.jp/dev/serial/01/java-system-operation/0008

FAQ

スペースからタブへの変換は困難

メリット

タブの方が情報圧縮されている

スペースの方がエントロピーが高い

Tips

単一責務性の違反指数

単一責務性の違反指数(SRP)を計算するようにしています。

SRP=R+U+((L/100)-5)

R:修正リビジョンのユニーク数

U:修正ユーザのユニーク数

L:モジュールのライン数

この値が大きければ大きいほど単一の「大きな」モジュールが「何度も多くの人に」触られている状態であると言えます。これはコンポーネントの変更の多さに対してモジュールの分割が不十分であることを証明しているという判断によるものです。

この指標を各コンポーネント内のコードに適用し,降順に並べ替えると,「王様モジュール」のようになっているものを割り出せます。

http://gihyo.jp/dev/serial/01/perl-hackers-hub/000803

function get_SRP() {
local target_filepath=$1
echo $((     $(git --no-pager blame --line-porcelain $target_filepath | sed -n 's/^summary //p' | sort | uniq -c | sort -rn | wc -l) +     $(git --no-pager blame --line-porcelain $target_filepath | sed -n 's/^author //p' | sort | uniq -c | sort -rn | wc -l) +     ( $(cat $target_filepath | wc -l) / 100 - 5)   )) $target_filepath
}

# SRPが酷い順(大きい順)に "SRP ファイル名" を標準出力
for file in `git ls-files | grep -E '.cc|.h|.c'`; do
get_SRP $file
done | sort -k1,1 -nr