3

私は Dietel の C++ プログラミングの本を読んでいました。この本では、プログラマーが実装ではなく、コードのインターフェース部分のみをリリースする方法について言及しています。

したがって、これを python に引き継ぐ:

2 つのファイルがあります: 1) 実装ファイル = accountClass.py および 2) インターフェース ファイル = useAccountClass.py

実装ファイルをコンパイルし、.pyc ファイルを取得しました。したがって、自分のコードを他の人に提供するときは、.pyc ファイルとインターフェイス ファイルを提供しますよね?

また、誰かに .pyc ファイルのみを提供した場合、その人が自分でインターフェイスを作成することを期待できますか? 私はノーと言うつもりです。しかし、私が持っているこのしつこい疑いがあります:

numpy と scipy の作成者は、実装をエンド ユーザーと共有しませんでした。また、インターフェースも共有していなかったと思います。ただし、numpy と scipy の両方でさまざまなクラスとそのメソッドを検索できます。したがって、この numpy と scipy の例を使用して、私が尋ねようとしているのは次のとおりだと思います。

コンパイル済みの実装ファイル (この場合は accountClass.pyc) のみを提供した場合、他の誰かが私のコードへのインターフェイスを作成することは可能ですか? その人は、実装で定義したクラスとメソッドをどのように知ることができますか? つまり、彼らは

if __name__ = "__main__" : 
    blah blah 

または他の方法がありますか??

4

3 に答える 3

4

あなたはそれを完全に間違っていました。あるいは、著者が重大な間違いを犯した恐ろしい本かもしれません。実際、他のコードを使用するコードは、重大な反論がない限り、インターフェースに準拠し、実装の詳細を気にする必要はありません。ただし、マシン コード (C++ など) への静的コンパイルの世界でも、これは実装のソース コードをロックする必要があるという意味ではありません。

誰かが実装にアクセスできるかどうかと、特定のコードを書くときにその知識を利用できるかどうかは、まったく別の問題です。実装の作成者でさえ、他のコード (たとえば、他のモジュール) で作業しているときにインターフェイスにプログラムすることができます/すべきです。同様に、誰かから実装をロックしたとしても、彼らはインターフェースの一部ではない実装の癖に非常に依存している可能性があります。マシン コードへの静的コンパイルの世界で、ソース コードではなくヘッダーとオブジェクト ファイルのみを提供する人がいる場合、それはプロジェクトがクローズド ソースであるためであり、クライアント間で優れたプログラミング プラクティスを推奨するものではありません。

Python では、あなたの質問は意味がありません。「インターフェイス」ファイルと「実装」ファイルはなく、実行されて関数、クラス、およびその他の値を定義するコードだけがあります。あなたが提供するインターフェースファイルのようなものはありません。実装を提供し、(できれば) インターフェイスと実装の詳細の両方を詳述するドキュメントを提供します。そして、モジュールがインポートされると、クラス オブジェクト、関数オブジェクト、およびその他のオブジェクトに、多くの情報が含まれます (多くの場合、ドキュメントの大部分が生成された元のテキストを含みます)。これは、numpy などの拡張モジュールにも当てはまります。そして、それらの実装アクセス可能ですが、ほとんど役に立たないため、すべてのディストリビューションに含まれているわけではありません。Python コードでは、それ以外はプラットフォーム固有であるため、実際にはソース コードを配布する必要があります。

ちなみに、.pyc ファイルはかなり高レベルであり、逆アセンブルすると簡単に理解できます (これは、モジュールをインポートして、dis内部の任意の関数で stdlib モジュールを実行するのと同じくらい簡単です)。すでに間違った質問であるため、これはマイナーな専門性であると考えています。

于 2012-07-05T19:22:02.337 に答える
0

C ++プログラマーに対するDeitelのアドバイスは、いくつかの理由からPythonには当てはまりません。

  1. Pythonはマシンコードにコンパイルされていないため、プログラムをどのような形式で提供しても、誰かがコードを読むのは比較的簡単です。

  2. Pythonには.hファイルと.cファイルはありません。提供できるのは、.pyファイルまたは.pycファイルだけです。

  3. とにかく、コードを秘密として扱うのはちょっとばかげています。他の人から隠しておく必要があるコードには何がありますか?

NumpyとScipyは主にCで実装されているため、自分の便宜のためにソースがありません。必要に応じてソースを入手できます。そのコードへの「インターフェース」は、インポートして呼び出すことができるモジュールです。

于 2012-07-05T19:19:35.813 に答える
0

「ユーザー インターフェイス」と「クラス インターフェイス」を混同しないでください。useAccountClass ファイルがある場合、私の理解が正しければ、そのファイルはおそらく accountClass ファイルで定義されたクラスとメソッドを使用して何らかのタスクを実行します。

ファイルを他の人に送信する場合、コンパイルされたクラスが何をするかを「推測」することは想定されていません。それが DOCUMENTATION の目的です: モジュールに含まれる関数 (コンパイルされているかどうかに関係なく) の説明、それらが受け取るパラメーター、それらが返す値、およびそれらが行うことが期待されること、それらが実行するタスクの「意味」。

抽象的な例として、画像処理クラスがあるとします。そのクラスに関数がある場合findCircles(image)、ドキュメンテーションは、おそらく円を含む画像を取り、画像に含まれる円の中心の座標のリストまたは配列を返すことを説明する必要があります。円がどのように検出されるかは重要ではありません。関数を使用するためにそれを知る必要はありません。関数が のように呼び出された場合findCircles(image, gaussian_threshold=10)、呼び出し元は関数が「gaussian_threshold」パラメーターを使用していることを知る必要があります。つまり、呼び出し元は関数の内臓について知る必要があり、OOP ではこれは良くありません。将来別のアルゴリズムを使用することにした場合、その関数を使用するすべてのコードを書き直す必要がありgaussian_thresholdます。

したがって、OOP のインターフェイスは、実装の言語ではなく、問題の言語でタスクを実行するために知る必要がある正規のパラメーターまたは入力のみをオブジェクトに伝達するために使用される抽象化です (いつでも変更できます)。 )。

この意味でのドキュメントは、適切な入力が与えられた場合に関数が期待どおりに実行されることをユーザー (この場合は別の開発者) に保証する契約です。

ここで、プログラムを使用したい非技術者である最終ユーザーは、クラス定義 (モデル) だけでなく、作業プログラム全体 (コントロールとビュー) を必要とします。

これがお役に立てば幸いです。「Code Complete 2nd ed」という本をお勧めします。そして「実用的なプログラマー - ジャーニーマンからマスターへ」は、幅広いトピックに関する非常に啓発的な読み物です。

于 2012-07-05T19:36:30.100 に答える