C++によるリファクタリング 11
質問
c++ によって提供される新しいツールセットを考えると、コードの簡略化、表現力、効率性を目指す多くのプログラマは、古いコードをざっと読んで、その目標を達成するために微調整を行います (無意味なものもあれば、成功するものもあります)。そのような労働にあまり時間を費やさないようにし、押し付けがましくない、自己完結した変更を行う一方で、ベストプラクティスは何でしょうか?
明らかなものを除外してみましょう。
-
使用する 自動 を使って、イテレータベースのループを実行します。
for (std::vector<foo>::const_iterator it(lala.begin()), ite(lala.end()); it != ite; ++it); // becomes for (auto it(lala.cbegin()), ite(lala.cend()); it != ite; ++it);
-
使用方法 ネクタイ は、C 言語風のコード列を生成するだけの多重代入のために ( 構造体に複数の値を一度に代入する方法は? )
a = 1; b = 2; c = 3; d = 4; e = 5; // becomes std::tie(a, b, c, d, e) = std::make_tuple(1, 2, 3, 4, 5);
-
クラスを継承できないようにするには、そのクラスを "final" と宣言し、そのような動作を実現したコードを削除します。 http://www.parashift.com/c++-faq/final-classes.html
-
コンストラクタやデストラクタを private 宣言するのではなく、明示的に隠すために delete キーワードを使用します (例: ヒープベースのオブジェクトやコピー不可能なオブジェクトを作成するコードなど)。
-
単一のSTLアルゴリズムの実行を容易にするためだけに作成された些細なファンクタを ラムダ 関数に変更します(コードの散らかりを減らす以外に、インライン呼び出しが保証されます)。
-
オブジェクトの RAII ラッピングを単純化するために スマートポインタ
-
bind1st、bind2ndを廃止し、単に バインド
-
型特性 (Is_ptr_but_dont_call_for_const_ptrs<> など :) の手書きコードを、以下の標準コードに置き換える。 < type_traits >
-
STLで実装された機能性のためのboostヘッダを含むことをやめました(BOOST_STATIC_ASSERT vs static_assert)。
-
クラスへの移動セマンティクスの提供(ただし、これはダーティ/クイック/イージーな変更として適格ではないでしょう)
-
使用方法 nullptr を使用し、ポインタのコンテナをオブジェクト型にキャストされた 0 で埋めていたコードを削除してください。
std::vector<foo*> f(23); for (std::size_t i(0); i < 23; ++i) { f[i] = static_cast<foo*>(0); } // becomes std::vector<foo*> f(23, nullptr);
-
ベクターデータのアクセス構文をクリアする
std::vector<int> vec; &vec[0]; // access data as a C-style array vec.data(); // new way of saying the above
-
throw()を noexcept (非推奨の例外指定を避ける以外に、速度面での利点があります。 http://channel9.msdn.com/Events/GoingNative/2013/An-Effective-Cpp11-14-Sampler @ 00.29.42)
void some_func() noexcept; // more optimization options void some_func() throw(); // fewer optimization options void some_func() ; // fewer optimization options
-
コンテナ内の tempory をプッシュして、オプティマイザがコピーを消去してくれることを期待するようなコードを emplace" 関数に置き換えることで、引数を完全に転送し、テンポラリなしでオブジェクトをコンテナに直接構築します。
vecOfPoints.push_back(Point(x,y,z)); // so '03 vecOfPoints.emplace_back(x, y, z); // no copy or move operations performed
最新情報
Shafik Yaghmour氏の回答 の回答は、聴衆に最も受け入れられたとして、当然のことながら賞金を授与されました。
R Sahu氏の回答 は私が認めたもので、なぜなら の組み合わせ を捉えているからです。 リファクタリングの精神 : コードをより明確に、よりきれいに、よりシンプルに、よりエレガントにすることです。
どのように解決するのですか?
デリゲートコンストラクタとクラス内メンバ初期化子を追加する。
委譲コンストラクタとクラス内初期化の使用による簡素化
C++03で。
class A
{
public:
// The default constructor as well as the copy constructor need to
// initialize some of the members almost the same and call init() to
// finish construction.
A(double data) : id_(0), name_(), data_(data) {init();}
A(A const& copy) : id_(0), name_(), data_(copy.data_) {init();}
void init()
{
id_ = getNextID();
name_ = getDefaultName();
}
int id_;
string name_;
double data_;
};
C++11で。
class A
{
public:
// With delegating constructor, the copy constructor can
// reuse this constructor and avoid repetitive code.
// In-line initialization takes care of initializing the members.
A(double data) : data_(data) {}
A(A const& copy) : A(copy.data_) {}
int id_ = getNextID();
string name_ = getDefaultName();
double data_;
};
関連
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】C++の余分な資格エラー
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み] C++11で非推奨となるC++イディオムは?
-
[解決済み] 値の初期化を試みたが、関数宣言と解釈された。A a(()); で解決しないのはなぜか?
-
[解決済み] C++11の新機能である宣言時のメンバー初期化機能により、初期化リストは廃止されたのでしょうか?