Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
京大 マイコンクラブ
PDF, PPTX
22,434 views
よいコード、わるいコード
KMCの例会講座で発表された、C++でよいコードを書くための指南。
Technology
◦
Read more
64
Save
Share
Embed
Embed presentation
Download
Download as PDF, PPTX
1
/ 28
2
/ 28
3
/ 28
4
/ 28
5
/ 28
6
/ 28
7
/ 28
8
/ 28
9
/ 28
10
/ 28
11
/ 28
12
/ 28
13
/ 28
14
/ 28
15
/ 28
16
/ 28
17
/ 28
18
/ 28
19
/ 28
20
/ 28
21
/ 28
22
/ 28
23
/ 28
24
/ 28
25
/ 28
26
/ 28
27
/ 28
28
/ 28
More Related Content
PDF
プログラムを高速化する話Ⅱ 〜GPGPU編〜
by
京大 マイコンクラブ
PDF
国際会議運営記
by
Takayuki Itoh
PDF
マルチコアを用いた画像処理
by
Norishige Fukushima
PDF
Re永続データ構造が分からない人のためのスライド
by
Masaki Hara
PPTX
論文の書き方入門 2017
by
Hironori Washizaki
PDF
CUDAプログラミング入門
by
NVIDIA Japan
PPTX
[DL輪読会]“SimPLe”,“Improved Dynamics Model”,“PlaNet” 近年のVAEベース系列モデルの進展とそのモデルベース...
by
Deep Learning JP
PPTX
Angle-Based Outlier Detection周辺の論文紹介
by
Naotaka Yamada
プログラムを高速化する話Ⅱ 〜GPGPU編〜
by
京大 マイコンクラブ
国際会議運営記
by
Takayuki Itoh
マルチコアを用いた画像処理
by
Norishige Fukushima
Re永続データ構造が分からない人のためのスライド
by
Masaki Hara
論文の書き方入門 2017
by
Hironori Washizaki
CUDAプログラミング入門
by
NVIDIA Japan
[DL輪読会]“SimPLe”,“Improved Dynamics Model”,“PlaNet” 近年のVAEベース系列モデルの進展とそのモデルベース...
by
Deep Learning JP
Angle-Based Outlier Detection周辺の論文紹介
by
Naotaka Yamada
What's hot
PPTX
論文に関する基礎知識2016
by
Mai Otsuki
PDF
いまさら聞けない!CUDA高速化入門
by
Fixstars Corporation
PPTX
優れた研究論文の書き方
by
Masanori Kado
PDF
ドット絵でプログラミング!難解言語『Piet』勉強会
by
京大 マイコンクラブ
PDF
子供の言語獲得と機械の言語獲得
by
Yuya Unno
PDF
幾何を使った統計のはなし
by
Toru Imai
PDF
明日使えないすごいビット演算
by
京大 マイコンクラブ
PDF
深層強化学習と実装例
by
Deep Learning Lab(ディープラーニング・ラボ)
PPTX
優れた研究論文の書き方―7つの提案
by
Masanori Kado
PDF
cvpaper.challenge 研究効率化 Tips
by
cvpaper. challenge
PDF
目指せグラフマスター
by
HCPC: 北海道大学競技プログラミングサークル
PDF
AlphaGoのしくみ
by
Hiroyuki Yoshida
PDF
[DL輪読会]ICLR2020の分布外検知速報
by
Deep Learning JP
PDF
モデルアーキテクチャ観点からのDeep Neural Network高速化
by
Yusuke Uchida
PPTX
[DL輪読会]Learning Latent Dynamics for Planning from Pixels
by
Deep Learning JP
PDF
敵対的学習に対するラデマッハ複雑度
by
Masa Kato
PDF
CV分野におけるサーベイ方法
by
Hirokatsu Kataoka
PDF
Neural networks for Graph Data NeurIPS2018読み会@PFN
by
emakryo
PDF
ドロネー三角形分割
by
Yusuke Matsushita
PDF
スパースモデリング入門
by
Hideo Terada
論文に関する基礎知識2016
by
Mai Otsuki
いまさら聞けない!CUDA高速化入門
by
Fixstars Corporation
優れた研究論文の書き方
by
Masanori Kado
ドット絵でプログラミング!難解言語『Piet』勉強会
by
京大 マイコンクラブ
子供の言語獲得と機械の言語獲得
by
Yuya Unno
幾何を使った統計のはなし
by
Toru Imai
明日使えないすごいビット演算
by
京大 マイコンクラブ
深層強化学習と実装例
by
Deep Learning Lab(ディープラーニング・ラボ)
優れた研究論文の書き方―7つの提案
by
Masanori Kado
cvpaper.challenge 研究効率化 Tips
by
cvpaper. challenge
目指せグラフマスター
by
HCPC: 北海道大学競技プログラミングサークル
AlphaGoのしくみ
by
Hiroyuki Yoshida
[DL輪読会]ICLR2020の分布外検知速報
by
Deep Learning JP
モデルアーキテクチャ観点からのDeep Neural Network高速化
by
Yusuke Uchida
[DL輪読会]Learning Latent Dynamics for Planning from Pixels
by
Deep Learning JP
敵対的学習に対するラデマッハ複雑度
by
Masa Kato
CV分野におけるサーベイ方法
by
Hirokatsu Kataoka
Neural networks for Graph Data NeurIPS2018読み会@PFN
by
emakryo
ドロネー三角形分割
by
Yusuke Matsushita
スパースモデリング入門
by
Hideo Terada
More from 京大 マイコンクラブ
PDF
Pietで競プロしよう
by
京大 マイコンクラブ
PDF
多倍長整数の乗算と高速フーリエ変換
by
京大 マイコンクラブ
PDF
Geometry with Unity
by
京大 マイコンクラブ
PPTX
女の子になれなかった人のために
by
京大 マイコンクラブ
PDF
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
by
京大 マイコンクラブ
PDF
暗号技術入門 秘密の国のアリス 総集編
by
京大 マイコンクラブ
PDF
つくってあそぼ ラムダ計算インタプリタ
by
京大 マイコンクラブ
ODP
もし太陽のコアがIntelCoreだったら
by
京大 マイコンクラブ
PDF
エンジニアと健康
by
京大 マイコンクラブ
PDF
Common Lisp入門
by
京大 マイコンクラブ
PDF
C#でゲームを作る2016 第7回
by
京大 マイコンクラブ
PDF
C#でゲームを作る2016 第8回
by
京大 マイコンクラブ
PDF
かわいくなろうとしたら語彙力が下がった話
by
京大 マイコンクラブ
PDF
セミコロンレスc++
by
京大 マイコンクラブ
PDF
C#でゲームを作る2016 第5回
by
京大 マイコンクラブ
PPTX
hideya流 テストプレイ観察術
by
京大 マイコンクラブ
PDF
Altseed
by
京大 マイコンクラブ
PDF
テキストファイルを読む💪 第1回
by
京大 マイコンクラブ
PDF
No SSH (@nojima; KMC関東例会)
by
京大 マイコンクラブ
PDF
DTM練習会2017第1.5回 「伴奏の付け方」
by
京大 マイコンクラブ
Pietで競プロしよう
by
京大 マイコンクラブ
多倍長整数の乗算と高速フーリエ変換
by
京大 マイコンクラブ
Geometry with Unity
by
京大 マイコンクラブ
女の子になれなかった人のために
by
京大 マイコンクラブ
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
by
京大 マイコンクラブ
暗号技術入門 秘密の国のアリス 総集編
by
京大 マイコンクラブ
つくってあそぼ ラムダ計算インタプリタ
by
京大 マイコンクラブ
もし太陽のコアがIntelCoreだったら
by
京大 マイコンクラブ
エンジニアと健康
by
京大 マイコンクラブ
Common Lisp入門
by
京大 マイコンクラブ
C#でゲームを作る2016 第7回
by
京大 マイコンクラブ
C#でゲームを作る2016 第8回
by
京大 マイコンクラブ
かわいくなろうとしたら語彙力が下がった話
by
京大 マイコンクラブ
セミコロンレスc++
by
京大 マイコンクラブ
C#でゲームを作る2016 第5回
by
京大 マイコンクラブ
hideya流 テストプレイ観察術
by
京大 マイコンクラブ
Altseed
by
京大 マイコンクラブ
テキストファイルを読む💪 第1回
by
京大 マイコンクラブ
No SSH (@nojima; KMC関東例会)
by
京大 マイコンクラブ
DTM練習会2017第1.5回 「伴奏の付け方」
by
京大 マイコンクラブ
よいコード、わるいコード
1.
よいコード、わるいコード 京都大学理学部数学系4回生 KMC ID: hatsusato 2015/05/11
2.
2/28 自己紹介 ● hatsusato – 理学部数学系4回生 ● 最近は数学基礎論とか集合論とかやってる。 ● プログラミング言語を作りたい。 –
趣味 ● 作画アニメ – すきなもの ● C++ – きらいなもの ● C++
3.
3/28 よいコード わるいコード ● そんなの ひとの
かって – ではない。 – 良いコード、悪いコードは存在する。
4.
4/28 よいコード わるいコード ● この講座では、良いコード、悪いコードの例(当社調べ) を挙げることで啓蒙しようと思います。 –
サンプルコードには、良いコードを書くのが難しいと定評 のある[要出典]、C++を用います。 ● 僕がC++と言ったらそれはC++11以降のC++のことです。 – 他の言語ではあまり役に立たないアドバイスもあるか も。 ● 良いコード、悪いコードを知って、ライバルに差を つけろ!
5.
5/28 よいコード わるいコード ● ここでの良いコードとは、保守性の高いコードの ことを指すものとします。 – 機能の追加・修正を行い易く、バグが発生しにくい。
6.
6/28 目次 ● 一貫性 – 初期化 – オブジェクトの整合 ● 疎結合 –
間接メンバアクセス – 非メンバ関数 – const教 ● 例外安全 – No new, No delete
7.
7/28 一貫性 ● コードの一貫性を保つ – 何をしたいコードなのかを誰が読んでもわかるようにす る。 – コードの表記の一貫性を保つ ● コーディング規約とか。 –
オブジェクト表現の一貫性を保つ ● オブジェクトのコード上の見た目と表現する実体とを一致させ る。
8.
8/28 初期化 ● まず初期化しろ – 未初期化オブジェクトはしばしば未定義動作を引き起こ し、デバッグを困難にする。
9.
9/28 初期化 ● まだパフォーマンスを気にするような時間じゃな い – 初期化をあとですることによるパフォーマンス向上<< <<越えられない壁<<<<デバッグの利便性 – パフォーマンスは、ベンチマークを取ってから検討する。 –
プログラムの処理にかかる時間の80%は、コード全体の 20%の部分が占める。
10.
10/28 オブジェクトの整合 ● 悪い例 – Cでは文字列を格納する領域を表現するのに、先頭ポイ ンタと領域の長さとの2つで表現する。 – 2つは密接に関連するのに、別々に管理される。 整合性のないオブジェクトが簡単に出来てしまう! #include
<cstdio> char* fgets(char* str, int count, FILE* stream);
11.
11/28 オブジェクトの整合 ● 良い例 – stringクラスは文字列の情報をまとめて管理する。 オブジェクトの整合性は常に保たれる! #include <string> istream&
getline(istream& input,string& str);
12.
12/28 オブジェクトの整合 ● お互いに強く依存するオブジェクトはまとめて管 理する。 – 我々が通常構造体などを導入して行っていること。 ● 単にまとめるだけでなく、オブジェクト全体が常に有 効な状態になるようにする。 – stringの保持する文字数とsize()とは連動する。
13.
13/28 疎結合 ● 各コンポーネント間の依存度をできるだけ下げる – 問題を細かく分割して考えることができる。 – 変更のもたらす影響の範囲を把握しやすくなる。 –
コンポーネントの再利用性が高まる。
14.
14/28 間接メンバアクセス ● 悪い例 – オブジェクトのメンバに直接アクセスしている。 メンバの名前との依存関係がオブジェクトの外にま で染み出してしまう! #include <utility> pair<int,
int> pii; pii.first = 0; pii.second = 1;
15.
15/28 間接メンバアクセス ● 良い例 – オブジェクトのメンバに間接的にアクセスしている。 メンバへのアクセスが抽象化され、自由度が増加! #include <tuple> tuple<int,
int> tii; get<0>(tii) = 0; get<1>(tii) = 1;
16.
16/28 間接メンバアクセス ● メンバ変数より関数の方が疎結合 – 関数でアクセスするようにしておけば、変数の名前や表 現方法を変更しても、ユーザコードに影響しないように できる。
17.
17/28 非メンバ関数 ● 悪い例 begin()やend()をメンバとしてもたないオブジェクト に対して適用できない! template <typename C,
typename F> void foreach(C&& c, F&& f) { for (auto it = c.begin(); it != c.end(); ++it) { f(*it); } }
18.
18/28 非メンバ関数 ● 良い例 begin()やend()のオーバーロードを追加すること で、任意のオブジェクトに対して拡張できる! template <typename C,
typename F> void foreach(C&& c, F&& f) { for (auto it = begin(c); it != end(c); ++it) { f(*it); } }
19.
19/28 非メンバ関数 ● メンバ関数より非メンバ関数の方が疎結合 – メンバ関数は対応するクラスとの依存関係がある。 – メンバ関数はthisポインタへのアクセス権を持つので、ク ラスメンバとの依存性も高い。
20.
20/28 const教 ● 悪い例 sを書き換えるつもりがないのに書き換わっている! int s[5] =
{0, 1, 2, 3, 4}; int d[5] = {}; for (int i = 0; i < 5; ++i) { s[i] = d[i]; }
21.
21/28 const教 ● 良い例 constをつければオブジェクトの不変性を明示でき る! const int s[5]
= {0, 1, 2, 3, 4}; int d[5] = {}; for (int i = 0; i < 5; ++i) { s[i] = d[i]; // compile error }
22.
22/28 const教 ● const教 is
何? – ローカル変数を含めたあらゆるオブジェクト・関数にでき るだけconst修飾を施す思想のこと。 – constを付けずに書けるところでも、できるだけconstを 使って書くようにする。 – const教らしいコードの例 ● constをつければ実際安心! const int n = [](){ int tmp = 0; cin >> tmp; return tmp; }();
23.
23/28 例外安全 ● C++は例外機構を持つ – 例外が発生すると、従来のC的なエラーハンドリングで は対処できない不整合が発生しうる。 –
例外が発生した時に、リソースリークやデータの不整合 が発生しない保証を例外安全という。 ● 例外安全は難しい – 難しいからと言って諦めては、良いコードは書けない。 ● 例外安全でないコードはその時点で潜在的なバグを持つ。 – 例外安全を意識する姿勢は大切。
24.
24/28 No new, No
delete ● 悪い例 secondの確保に失敗した場合、firstがリークする! struct X { X() : first(new int(1)), second(new int(2)) {} ~X() { delete first; delete second; } int *first, *second; };
25.
25/28 No new, No
delete ● 良い例 IntPtrがそれぞれのリソースを管理するのでリーク しない! struct IntPtr { IntPtr(int n) : ptr(new int(n)) {} ~IntPtr() { delete ptr; } int *ptr; }; struct X { X() : first(1), second(2) {} IntPtr first, second; };
26.
26/28 No new, No
delete ● もっと良い例 newやdeleteは自分で書かない! template <typename T, typename... Args> unique_ptr<T> make_unique(Args&&... args) { return unique_ptr<T>( new T(forward<Args>(args)...)); } struct X { X() : first(make_unique<int>(1)), second(make_unique<int>(2)) {} unique_ptr<int> first, second; };
27.
27/28 No new, No
delete ● 訓練されたC++erはdeleteを書かない – newもラップして使うので、直接書かない。 ● デストラクタは1つの仕事だけをする – デストラクタが複数の仕事をしている。 → 対応する複数の初期化が存在する。 → 複数の仕事は同時にはできない。 → 一部しか初期化が済んでない段階で例外が投げら れると不整合が発生する。 → 例外安全でない。
28.
28/28 まとめ ● 変更に耐えるコードを書くよう心がけよう! – キーワード:一貫性・疎結合 – 例外安全は難しいけど、少しずつ慣れていこう。 ● 良いコードは身を助く –
将来困らないように(困らせないように)、今のうちに注意 しておこう。
Download