web-dev-qa-db-ja.com

標準のC関数をカプセル化しますか?

Cプログラミング言語を学び、安全な方法を学びながら、標準ライブラリのいくつかの部分に機能のレイヤーを書く傾向があります。これには2つの目的があります。言語の標準部分をより身近で合理的な方法で使用できることと、必要に応じてその機能を自分のものに簡単に置き換えることができることです。

私はこれから利益を得ることができますが、私はそれをすべきですか?例として、メモリ管理を考えることができます。各オブジェクトのコンストラクターにmalloc()を記述し、メモリ割り当てを自分で処理する必要があると判断した場合は、すべてのオブジェクトに関連付けられているコンストラクターを編集する必要があります。自分の関数を参照することで、新しいコンストラクターを作成せずにその関数の内容を変更できます。

これを行う必要があることは明らかですが、私はPythonに慣れています。私はその環境で非常に快適であり、プログラムのどの部分からでも標準ライブラリのどの部分にも問題なくリンクできます。プロジェクトの存続期間中、その関係はほぼ確実にそのままにしておくからです。私がCで遭遇している状況は、私が自分自身から言語を隠そうとしているように感じます。

C標準ライブラリ上に機能のレイヤーを作成することは、言語の学習とコードベースの開発に役立ちますか、それとも今後の理解を阻害しますか?

4
Jack Stout

適切な視点を保持している限り、独自のレイヤーを作成するのにある程度の用途があると思います。

コードについて他の人とやり取りするときでも、標準関数の観点からコードについて話す必要があります。

しかし、便利な一連の素敵なルーチンをまとめると、同様のアプリケーションを作成するのに役立つ可能性があります。最悪の場合、最終的に発生する可能性のあるアーティファクトは、適切に編成されたスニペットファイルにすぎません。そして、それはそれほど悪いことではありません。これはiffあなたが視点を保つことです。

船外に出る危険があります。基本的に内に独自の言語を実装するC.そして、それは危険でクレイジーな領域です!あなたは本当にクールなものをつかんで次の大きなものになるかもしれません(それは起こるかもしれません!)またはあなたは憶測の無限の輪の周りを跳ね回るかもしれません:ああ、そしてthisthisのように表現でき、そのすべてthisインターフェースを介してより単純になり、すべてを新しいスーパーカノニカルに変換します。 -)表現、および.。

xkcd: "Standards"

http://xkcd.com/927/

私が話している危険地帯は、 「建築宇宙飛行士」パラダイム とほぼ同じだと思います。 <yoda>覚えておいてください:別のゲームエンジンを構築するのではなく、ゲームを構築してください。次に、2番目のゲーム。次に、3番目のゲーム。次に、エンジンを構築できます。 </ yoda>

APIの上にレイヤーを作成することは、アプリケーションを構築するための可能な方法です。これは、私が今までに見つけた中で最も読みやすいX11本の1つであるX Window Applications Programming(Johnson&Reichard)(少なくとも1996年までK&R関数構文を使用し続けたシリーズ!)によって採用されたアプローチですが、教育学的価値については、貴重です。上で触れたように、よく整理されたスニペットファイル。

8
luser droog

標準のAPIの上にレイヤーを作成したいという誘惑は、初心者の間では一般的です。私も行ったことがあります。

短期的なメリットがあるかもしれませんが、そうしないことを強くお勧めします。標準APIは、定義上、標準です。これはすべての開発者に知られ、使用されており、遅かれ早かれあなたはそれを知って使用する必要があります。標準のAPIを、自分だけが使い慣れたものでカプセル化して、その学習を遅らせないでください。

4
mouviciel

+ 1 @ mouviciel。

私はパスカル高速道路からCに入った(ターボパスカルとそう、それは長い時間前だった)。私はCが「始まり」と「終わり」を必要としていると判断し、何ヶ月も苦労して役に立たなかった。心配する大きな魚がいたので、結局私はあきらめました。解釈上の変更は、数か月(または数年)でコードを更新する必要がある人にとって論理的である必要があります。彼らはあなたではなく、あなたのPOVを持っていないので、オッズは起こりません。あなたのコード(そして評判)はことわざのバスの下に投げ込まれます。

弾丸を噛んで掘り下げることをお勧めします。プリプロセッサを採用します。機能を制御するためのプレゼンテーション層の失敗に対処する必要があります(Pythonic White Space Rulesパラダイム)。また、O-Oのハードルをすでに乗り越えているので、C++にジャンプすることをお勧めします。複数の基本クラスが大好きになり、独自のGCを実行する必要があります。

私のお気に入りのリファレンスはHarbison-Steeleでしたが、それは(前述のように)何ヶ月も前のことです。

2
mnemotronic

PythonからC/C++への移行は、複雑さの大幅な増加であり、コードでその複雑さを管理する方法を見つけたいと思っているのは当然です。

実際には、独自の複雑さ管理レイヤーを作成しようとすると失敗します。部分的には、おそらく言語とそれを効果的に使用して良い仕事をする方法について十分に知らないためです。次に、あなたが求めているものを提供するライブラリがすでにそこにあります(C/C++の方法ではありませんが、 python)

ヒープメモリを安全に管理する方法として、特にshared_ptrクラスとauto_ptrクラスの周りで、標準テンプレートライブラリコードをよく読んでください。これにより、C++を使用してpythonコードを記述しようとするのではなく、時間の経過とともにC++の問題を解決する方法を十分に理解できるようになります。

0
Michael Shaw