1

私は OCaml でシングルトン デザイン パターン (qua Java) を概念化しようとしていますが、GoF の作業の概念実証で使用していないファンクターやモジュールをほのめかしているインスタンスを見たことがあります。基本的に、OCaml を使用して次の機能を再作成したいと思います。

public class Singleton
{
 private static Singleton UniqueInstance; 
 private Singleton(){}
 public static Singleton getInstance()
 {
  if(UniqueInstance==null)UniqueInstance=new Singleton();
  return UniqueInstance;
 }
}

これはモジュールやファンクターなしで可能ですか?

4

2 に答える 2

4

モジュールソリューションが機能しない理由を説明できますか?モジュールは、他の言語のシングルトンで行うことを実際に行うための自然な方法です。

一般的な問題として、GOFスタイルのパターンはOCamlではほとんど関係ありません。確かに、オブジェクトはOCamlではほとんど無関係です。オブジェクト指向のバックグラウンドを持つ人々は、OCamlのオブジェクト指向機能を使用することから始めるべきだと考えることがよくありますが、これは間違いです。他の言語のオブジェクトで解決されるほとんどの問題は、パラメトリック多態性、代数的データ型、およびOCamlのモジュールで解決されます。ファンクターはもう少し高度なトピックであり、オブジェクトはそこにあります。残りの言語の熟練したユーザーになるまで、オブジェクトシステムに触れないでください。

于 2009-02-12T03:53:50.540 に答える
3

Ocaml のオブジェクトは、静的/グローバル メソッドを持つことはできません。試すことができます、Immediate objects。警告、オブジェクトのコピーを取得するために obj.copy を引き続き実行できると思います。それらが評価されるたびに、新しいオブジェクトを返します(したがって、オブジェクトにパラメーターを渡すことはできません。カプセル化とグローバルブール値ですが、今はモジュールを扱っています)。もちろん、例のようなものしかない場合は、

let p = object 
   val mutable x = 0
   method get_x = x
   method move d = x <- x + d
end

p一度評価され、毎回それにアクセスします。もちろん、p#copy を使用すると、問題が発生します。モジュールはここに行く方法です。Ocaml の OO 機能は、他の言語ほど「強力」ではありません。もちろん、それはプロジェクトの目標ではありません。そのモジュール システム非常に強力です。

モジュール(グローバル) シングルトンです。それらを構築するために書く必要があるものは本当にありません。それらは暗黙のうちに言語に含まれています。たとえば、ファイルにログを記録するにはどうすればよいでしょうか。

---logging.ml
(* default channel to log *)
let log_channel = ref stdout

(* set the log to a channel *)
let set_log_chan chan = log_channel := chan

(* timestamp of log -- kinda heavy weight, but just for kicks *)
let get_log_prequel () = 
    let time = Unix.localtime (Unix.time ()) in
    (* format the time data into "y/m/d - h:m:s" format *)
    Printf.sprintf  "%d/%02d/%02d - %02d:%02d:%02d"
                    (time.Unix.tm_year+1900) time.Unix.tm_mon time.Unix.tm_mday
                    time.Unix.tm_hour time.Unix.tm_min time.Unix.tm_sec

(* log a string to the channel *)
let log_string str =
    output_string (!log_channel) ((get_log_prequel ())^":\t"^str^"\n")

---logging.mli
set_log_chan : in_channel -> unit
log_string : string -> unit

ここで要点がわかると思います。シングルトンは暗黙的ですよね?オブジェクトのようなインスタンス化は実際にはありませんが、それはシングルトンで必要なもののようなものです。などの他のファイルで使用を開始するだけでLogging.log_string "parsed file "^file_name^" successfully."、どこでも同じチャネルを使用できます。

ファンクターを使用すると、モジュールを構成して多様性を追加できます。モジュール/関数を指定して出力用の前日譚を生成するなど。

于 2009-02-11T20:10:27.377 に答える