6

Haskell でスネーク ゲームを書いています。これらは私が持っているもののいくつかです:

  • Coordデータ型
  • Lineデータ型
  • Rectデータ型
  • 一連の行 ( ) としてPolygon取得できる型クラス。Rect[Line]
  • を一連の Coords ( ) として取得Impassableできる型クラスで、他の 間の衝突を検出できます。Line[Coord]Impassable
  • Draw画面に描画したいものの型クラス (HSCurses)。
  • Arbitrary最後に、QuickCheck を使用しているので、これらの多くのインスタンスを宣言したいと考えています。

現在、私はこれらを別々のモジュールにたくさん持っているので、小さなモジュールがたくさんあります。お互いにたくさんインポートしなければならないことに気づいたので、何がポイントだったのだろうと思っています。

私は特にArbitraryインスタンスについて混乱しています。使用する-Wallと、孤立したインスタンスについて警告が表示されますが、それらのインスタンスを 1 つのテスト ファイルにまとめると、データ型が定義されている場所と同じモジュールにそれらのインスタンスを配置することでその警告を回避できると理解していますが、その後はimport Test.QuickCheckQuickCheck はテスト実行可能ファイルをビルドするときにのみ必要なはずなので、ばかげているように見えるすべてのモジュールに対して。

プログラムをモジュールに分割する方法/場所のより一般的な問題に関するガイダンスと同様に、QuickCheck に関する特定の問題に関するアドバイスをいただければ幸いです。

4

4 に答える 4

4

ケーキを持って食べることもできます。モジュールを再エクスポートできます。

module Geometry 
    ( module Coord, module Line, module Rect, module Polygon, module Impassable )
where

私は通常、完全な抽象化があるときはいつでもモジュールを使用します。つまり、データ型の意味がその実装と異なる場合です。あなたのコードについてほとんど知らないので、おそらくグループPolygon化しImpassableてまとめて、Collisionそれらが返すものを表すデータ型を作成するでしょう。しかしCoordLine、 、およびRectは適切な抽象化のように見え、おそらく独自のモジュールに値するでしょう。

于 2010-10-23T00:52:20.697 に答える
2

テスト目的で、Arbitraryインスタンスに個別のモジュールを使用します。-Wall通常、孤立したインスタンスは避けますが、これらのモジュールはテスト実行可能ファイルをビルドするときにのみビルドされるため、孤立したインスタンスやクリーンでないことは気にしません。-fno-warn-orphansを使用して、この警告メッセージだけを無効にすることもできます。

于 2010-10-23T01:14:30.723 に答える
1

私は通常、公開するデータ型よりも、公開する関数によって定義されるモジュール インターフェイスに重点を置きます。あなたのタイプのいくつかは、共通の機能セットを共有していますか? 次に、それらを同じモジュールに入れます。

しかし、私は通常小さなプログラムを書くので、私の練習はおそらく最善ではありません。Hackageのコードを見て、パッケージのメンテナーが何をしているのかを確認することをお勧めします。

コミュニティの評価やダウンロード数でパッケージを並べ替える方法があれば、そこから始めるのがよいでしょう。(あると思っていたのですが、今探しても見つかりません。) それができない場合は、既に使用しているパッケージを参照してください。

于 2010-10-23T00:44:55.173 に答える
0

QuickCheck を使用した 1 つの解決策は、C プリプロセッサを使用して、テスト時に Arbitrary インスタンスを選択的に有効にすることです。Arbitrary インスタンスをメイン モジュールに直接配置しますが、それらをプリプロセッサ マクロでラップしてから、「テスト」フラグを Cabal ファイルに配置します。

于 2013-08-23T21:23:39.710 に答える