এফ # এবং সি # উভয়ই ব্যবহারের জন্য এফ # লাইব্রেরি ডিজাইনের জন্য সেরা পদ্ধতির


113

আমি এফ # তে একটি লাইব্রেরি ডিজাইনের চেষ্টা করছি। লাইব্রেরিটি F # এবং C # উভয়ই ব্যবহারের জন্য বন্ধুত্বপূর্ণ হওয়া উচিত ।

এবং এখানেই আমি কিছুটা আটকে আছি। আমি এফ এটিকে # বন্ধুত্বপূর্ণ করতে পারি, বা আমি এটি সি # বান্ধব করে তুলতে পারি তবে সমস্যা কীভাবে এটি উভয়ের জন্য বন্ধুত্বপূর্ণ করা যায়।

এখানে একটি উদাহরণ। ভাবুন এফ # তে আমার নিম্নলিখিত ফাংশন রয়েছে:

let compose (f: 'T -> 'TResult) (a : 'TResult -> unit) = f >> a

এটি F # থেকে পুরোপুরি ব্যবহারযোগ্য:

let useComposeInFsharp() =
    let composite = compose (fun item -> item.ToString) (fun item -> printfn "%A" item)
    composite "foo"
    composite "bar"

সি # তে, composeফাংশনটির নিম্নলিখিত স্বাক্ষর রয়েছে:

FSharpFunc<T, Unit> compose<T, TResult>(FSharpFunc<T, TResult> f, FSharpFunc<TResult, Unit> a);

তবে অবশ্যই আমি FSharpFuncস্বাক্ষরে চাই না, আমি যা চাই তা Funcএবং Actionপরিবর্তে, এর মতো:

Action<T> compose2<T, TResult>(Func<T, TResult> f, Action<TResult> a);

এটি অর্জন করতে, আমি compose2এই জাতীয় ফাংশন তৈরি করতে পারি :

let compose2 (f: Func<'T, 'TResult>) (a : Action<'TResult> ) = 
    new Action<'T>(f.Invoke >> a.Invoke)

এখন এটি সি # তে পুরোপুরি ব্যবহারযোগ্য is

void UseCompose2FromCs()
{
    compose2((string s) => s.ToUpper(), Console.WriteLine);
}

তবে এখন আমাদের compose2# এফ থেকে ব্যবহার করতে সমস্যা হচ্ছে ! এখন আমাকে সমস্ত স্ট্যান্ডার্ড এফ # এর funsমধ্যে মুড়ে রাখতে হবে Funcএবং এর Actionমতো:

let useCompose2InFsharp() =
    let f = Func<_,_>(fun item -> item.ToString())
    let a = Action<_>(fun item -> printfn "%A" item)
    let composite2 = compose2 f a

    composite2.Invoke "foo"
    composite2.Invoke "bar"

প্রশ্ন: আমরা কীভাবে এফ # এবং সি # উভয় ব্যবহারকারীর জন্য এফ # তে লিখিত পাঠাগারটির জন্য প্রথম শ্রেণির অভিজ্ঞতা অর্জন করতে পারি?

এখনও অবধি আমি এই দুটি পদ্ধতির চেয়ে ভাল কিছু নিয়ে আসতে পারিনি:

  1. দুটি পৃথক সমাবেশ: একটি এফ # ব্যবহারকারীদের জন্য লক্ষ্যযুক্ত এবং দ্বিতীয়টি সি # ব্যবহারকারীদের C
  2. একটি অ্যাসেম্বলি তবে বিভিন্ন নামস্থান: এফ # ব্যবহারকারীদের জন্য একটি এবং দ্বিতীয়টি সি # ব্যবহারকারীদের জন্য।

প্রথম পদ্ধতির জন্য, আমি এই জাতীয় কিছু করব:

  1. একটি F # প্রকল্প তৈরি করুন, এটিকে FooBarFs বলুন এবং এটি FooBarFs.dll তে সংকলন করুন।

    • খালি এফ # ব্যবহারকারীদের কাছে লাইব্রেরিটিকে লক্ষ্য করুন।
    • .Fsi ফাইলগুলি থেকে অপ্রয়োজনীয় সবকিছু লুকান।
  2. অন্য একটি এফ # প্রকল্প তৈরি করুন, FooBarC গুলি থাকলে কল করুন এবং এটিকে FooFar.dll তে সংকলন করুন

    • উত্স স্তরে প্রথম এফ # প্রকল্পটি পুনরায় ব্যবহার করুন।
    • .Fsi ফাইল তৈরি করুন যা প্রকল্প থেকে সমস্ত কিছু আড়াল করে।
    • .Fsi ফাইল তৈরি করুন যা সি # উপায়ে লাইব্রেরিটি উন্মোচন করে, নাম, নামস্থান, ইত্যাদির জন্য সি # আইডিয়োম ব্যবহার করে
    • মূল লাইব্রেরিতে প্রতিনিধিত্বকারী মোড়ক তৈরি করুন, যেখানে প্রয়োজন সেখানে রূপান্তরটি করুন।

আমি মনে করি নেমস্পেসগুলির সাথে দ্বিতীয় পদ্ধতিটি ব্যবহারকারীদের জন্য বিভ্রান্তিকর হতে পারে, তবে তারপরে আপনার একটি সমাবেশ হবে।

প্রশ্ন: এগুলির কোনওটিই আদর্শ নয়, সম্ভবত আমি একধরণের সংকলক পতাকা / স্যুইচ / বৈশিষ্ট্য বা কোনও ধরণের ট্রিক মিস করছি এবং এটি করার আরও ভাল উপায় আছে?

প্রশ্ন: অন্য কেউ কি অনুরূপ কিছু অর্জন করার চেষ্টা করেছে এবং যদি হয় তবে কীভাবে আপনি এটি করেছিলেন?

সম্পাদনা: পরিষ্কার করার জন্য, প্রশ্নটি কেবল ফাংশন এবং প্রতিনিধিদের সম্পর্কেই নয় তবে একটি এফ # লাইব্রেরি সহ সি # ব্যবহারকারীর সামগ্রিক অভিজ্ঞতা। এর মধ্যে নেমস্পেসস, নামকরণের কনভেনশন, আইডিয়োমস এবং এ জাতীয় মত রয়েছে যা সি # এর স্থানীয়। মূলত, একটি সি # ব্যবহারকারীর সনাক্ত করতে সক্ষম হওয়া উচিত নয় যে লাইব্রেরিটি F # তে রচিত হয়েছিল। এবং বিপরীতে, কোনও এফ # ব্যবহারকারীর একটি সি # লাইব্রেরির সাথে ডিল করার মতো মনে করা উচিত।


সম্পাদনা 2:

আমি এ পর্যন্ত উত্তর এবং মন্তব্যগুলি থেকে দেখতে পাচ্ছি যে আমার প্রশ্নের প্রয়োজনীয় গভীরতার অভাব রয়েছে, সম্ভবত এটি কেবলমাত্র একটি উদাহরণ ব্যবহারের কারণে যেখানে এফ # এবং সি # এর মধ্যে আন্তঃব্যবহারের সমস্যা দেখা দেয়, ফাংশন মানগুলির ইস্যু। আমি মনে করি এটি সর্বাধিক সুস্পষ্ট উদাহরণ এবং তাই এটি আমাকে প্রশ্ন জিজ্ঞাসা করার জন্য এটি ব্যবহার করতে পরিচালিত করেছিল, কিন্তু একই টোকেনের দ্বারা এই ধারণাটি দেওয়া হয়েছিল যে এটিই কেবল আমিই উদ্বিগ্ন is

আমাকে আরও দৃ concrete় উদাহরণ প্রদান করুন। আমি সর্বাধিক চমৎকার এফ # কম্পোনেন্ট ডিজাইন গাইডলাইনস ডকুমেন্টটি পড়েছি (এর জন্য অনেক ধন্যবাদ @ গ্রেডবোট!)। দস্তাবেজের গাইডলাইনগুলি যদি ব্যবহার করা হয় তবে কিছু সমস্যার সমাধান করে তবে সবগুলিই নয়।

দস্তাবেজটি দুটি প্রধান অংশে বিভক্ত: 1) এফ # ব্যবহারকারীদের লক্ষ্য করার জন্য নির্দেশিকা; এবং 2) সি # ব্যবহারকারীদের লক্ষ্য করার জন্য নির্দেশিকা guidelines এমনকি কোথাও এটি ভান করার চেষ্টাও করা হচ্ছে না যে অভিন্ন পদ্ধতির উপস্থিতি সম্ভব, যা আমার প্রশ্নটির প্রতিধ্বনি দেয়: আমরা এফ # কে লক্ষ্য করতে পারি, আমরা সি # লক্ষ্য করতে পারি, তবে উভয়কে লক্ষ্যবস্তু করার জন্য ব্যবহারিক সমাধান কী?

মনে করিয়ে দেওয়ার জন্য, লক্ষ্যটি হল এফ # তে একটি লাইব্রেরি রচনা করা, যা এফ # এবং সি # ভাষা উভয় থেকেই মূর্তিমানভাবে ব্যবহার করা যেতে পারে ।

এখানে কীওয়ার্ডটি মূর্তিমান । ইস্যুটি সাধারণ আন্তঃঅযোগিতা নয় যেখানে বিভিন্ন ভাষায় গ্রন্থাগার ব্যবহার করা সম্ভব।

এখন উদাহরণগুলিতে, যা আমি সরাসরি # # কম্পোনেন্ট ডিজাইনের গাইডলাইন থেকে নিয়েছি ।

  1. মডিউল + ফাংশন (এফ #) বনাম নেমস্পেস + প্রকার + ফাংশন

    • এফ #: আপনার ধরণ এবং মডিউলগুলি রাখতে নেমস্পেস বা মডিউল ব্যবহার করবেন না। মুশকিল ব্যবহার মডিউলগুলিতে ফাংশন স্থাপন করা, যেমন:

      // library
      module Foo
      let bar() = ...
      let zoo() = ...
      
      
      // Use from F#
      open Foo
      bar()
      zoo()
    • সি #: ভ্যানিলা। নেট অ্যাপ্লিকেশনগুলির জন্য, উপাদানগুলির (মডিউলগুলির বিপরীতে) প্রাথমিক সাংগঠনিক কাঠামো হিসাবে নেমস্পেস, প্রকার এবং সদস্য ব্যবহার করবেন না।

      এটি F # গাইডলাইনটির সাথে সঙ্গতিপূর্ণ নয় এবং উদাহরণটি সি # ব্যবহারকারীদের ফিট করার জন্য পুনরায় লেখা দরকার:

      [<AbstractClass; Sealed>]
      type Foo =
          static member bar() = ...
          static member zoo() = ...

      যদিও এটি করে আমরা F # থেকে আইডিয়োমেটিক ব্যবহারটি ভাঙ্গি কারণ আমরা আর ব্যবহার করতে পারি না barএবং zooএটির সাথে পূর্বনির্ধারণ ছাড়াই Foo

  2. টিপলস ব্যবহার

    • এফ #: ফেরতের মানগুলির জন্য উপযুক্ত হলে টিপলগুলি ব্যবহার করবেন না।

    • সি #: ভ্যানিলা। নেট এপিআই-তে রিটার্ন মান হিসাবে টিপলগুলি ব্যবহার করা থেকে বিরত থাকুন।

  3. এসিঙ্ক

    • এফ #: এফ # এপিআই সীমানায় অ্যাসিঙ্ক প্রোগ্রামিংয়ের জন্য অ্যাসিঙ্ক ব্যবহার করবেন না।

    • সি #: .NET অ্যাসিনক্রোনাস প্রোগ্রামিং মডেল (বিগিনিউফু, এন্ডফু) অথবা এফ # অ্যাসিঙ্ক অবজেক্টের পরিবর্তে নেট নেট (টাস্ক) ফেরানোর পদ্ধতি হিসাবে অ্যাসিঙ্ক্রোনাস অপারেশনগুলি প্রকাশ করুন।

  4. ব্যাবহার Option

    • এফ #: ব্যতিক্রম উত্থাপনের পরিবর্তে রিটার্নের ধরণের জন্য বিকল্প মানগুলি ব্যবহার করার কথা বিবেচনা করুন (এফ # -ফ্যাসিং কোডের জন্য)।

    • ভ্যানিলা .NET এপিআইতে F # বিকল্প মান (বিকল্প) ফিরিয়ে দেওয়ার পরিবর্তে ট্রিগেটভ্যালু প্যাটার্নটি ব্যবহার করার বিষয়টি বিবেচনা করুন এবং F # বিকল্পের মানগুলি আর্গুমেন্ট হিসাবে গ্রহণের চেয়ে বেশি পদ্ধতি পছন্দ করুন।

  5. বৈষম্যমূলক ইউনিয়ন

    • এফ #: গাছ-কাঠামোগত ডেটা তৈরির জন্য শ্রেণিবৃত্তির বিকল্প হিসাবে বৈষম্যমূলক ইউনিয়নগুলি ব্যবহার করবেন না

    • সি #: এর জন্য কোনও নির্দিষ্ট নির্দেশিকা নেই, তবে বৈষম্যমূলক ইউনিয়নগুলির ধারণাটি সি # এর কাছে বিদেশী

  6. কার্ড ফাংশন

    • এফ #: ত্রিযুক্ত ফাংশনগুলি এফ # এর জন্য মূখ্য

    • সি #: ভ্যানিলা। নেট এপিআইগুলিতে প্যারামিটারগুলির কারিরিং ব্যবহার করবেন না।

  7. নাল মানগুলি পরীক্ষা করা হচ্ছে

    • এফ #: এটি এফ # এর পক্ষে মূখ্য নয়

    • সি #: ভ্যানিলা। নেট এপিআই সীমানায় নাল মান পরীক্ষা করার জন্য বিবেচনা করুন।

  8. এফ # ধরনের ব্যবহারের list, map, set, ইত্যাদি

    • এফ #: এফ # এ এগুলি ব্যবহার করা মূর্তিমান is

    • সি #: ভ্যানিলা .NET এপিআইগুলিতে প্যারামিটার এবং রিটার্ন মানগুলির জন্য .NET সংগ্রহ ইন্টারফেসের প্রকারের আইনিউমেন্টেবল এবং আইডিকোরিয়াস ব্যবহার বিবেচনা করুন। ( অর্থাত ব্যবহার করবেন না ফাঃ # list, map,set )

  9. ফাংশনের ধরণ (স্পষ্টত এক)

    • এফ #: এফ # ফাংশনকে মান হিসাবে ব্যবহার করা एफ # এর পক্ষে মূর্তিমানিক, স্পষ্টতই

    • সি #: ভ্যানিলা। নেট অ্যাপ্লিকেশনগুলিতে এফ # ফাংশন প্রকারের অগ্রাধিকার হিসাবে। নেট প্রতিনিধি প্রকারগুলি ব্যবহার করবেন না।

আমি মনে করি এগুলি আমার প্রশ্নের প্রকৃতি প্রদর্শনের জন্য পর্যাপ্ত হওয়া উচিত।

ঘটনাচক্রে, নির্দেশিকাগুলির একটি আংশিক উত্তরও রয়েছে:

... ভ্যানিলা .NET গ্রন্থাগারগুলির জন্য উচ্চ-আদেশের পদ্ধতিগুলি বিকাশ করার সময় একটি সাধারণ বাস্তবায়ন কৌশল হ'ল F # ফাংশন প্রকারগুলি ব্যবহার করে সমস্ত বাস্তবায়ন রচনার জন্য এবং তারপরে প্রকৃত এফ # বাস্তবায়নের শীর্ষে একটি পাতলা ফলক হিসাবে প্রতিনিধিদের ব্যবহার করে সর্বজনীন এপিআই তৈরি করা।

সংক্ষেপ.

একটি নির্দিষ্ট উত্তর আছে: আমি মিস করেছি এমন কোনও সংকলক কৌশল নেই

গাইডলাইনস ডক অনুসারে, মনে হয় যে প্রথমে এফ # এর জন্য রচনাকরণ এবং তারপরে .NET এর জন্য একটি ফ্যাসাদ মোড়ক তৈরি করা একটি যুক্তিসঙ্গত কৌশল।

প্রশ্নটি এর বাস্তব বাস্তবায়নের বিষয়ে এখনও থেকে যায়:

  • সমাবেশগুলি আলাদা করবেন? অথবা

  • বিভিন্ন নামস্থান?

আমার ব্যাখ্যাটি যদি সঠিক হয় তবে টমাস পরামর্শ দিচ্ছেন যে পৃথক নেমস্পেস ব্যবহার করা যথেষ্ট এবং একটি গ্রহণযোগ্য সমাধান হওয়া উচিত।

আমি মনে করি যে নামস্থানগুলির চয়নটি এমন যে এটি .NET / C # ব্যবহারকারীদের বিস্মিত বা বিভ্রান্ত করে না, যার অর্থ হল যে তাদের জন্য নামস্থানটি এটির মতো প্রাথমিক নেমস্পেসের মতো দেখা উচিত। এফ # ব্যবহারকারীদের এফ #-বিশিষ্ট নেমস্পেস চয়ন করার বোঝা নিতে হবে। উদাহরণ স্বরূপ:

  • FSharp.Foo.Bar -> লাইব্রেরির মুখোমুখি এফ # এর জন্য নেমস্পেস

  • Foo.Bar -> নেট র‌্যাপারের জন্য নেমস্পেস, সি #


8
কিছুটা প্রাসঙ্গিক research.microsoft.com/en-us/um/cambridge/projects/fsharp/...
gradbot

প্রথম-শ্রেণীর ক্রিয়াকলাপগুলি অতিক্রম করা ছাড়া আপনার উদ্বেগগুলি কী? এফ # ইতিমধ্যে অন্যান্য ভাষা থেকে বিরামবিহীন অভিজ্ঞতা সরবরাহের দিকে অনেক এগিয়ে গেছে।
ড্যানিয়েল

পুনরায়: আপনার সম্পাদনা, আপনি এখনও কেন F # তে রচিত একটি লাইব্রেরি সি # থেকে অ-মানক প্রদর্শিত হবে তা নিয়ে এখনও আমি অস্পষ্ট। বেশিরভাগ অংশে, F # সি # কার্যকারিতা একটি সুপারসেট সরবরাহ করে। লাইব্রেরিটিকে প্রাকৃতিক বোধ করা বেশিরভাগই কনভেনশনের বিষয়, যা আপনি কোন ভাষা ব্যবহার করছেন তা সত্য নয়। যা বলার জন্য, এফ # আপনাকে এটি করার জন্য প্রয়োজনীয় সমস্ত সরঞ্জাম সরবরাহ করে।
ড্যানিয়েল

সত্যিই আপনি একটি কোড নমুনা অন্তর্ভুক্ত করা সত্ত্বেও, আপনি মোটামুটি খোলার প্রশ্ন জিজ্ঞাসা করছেন। আপনি "একটি এফ # লাইব্রেরি সহ সি # ব্যবহারকারীর সামগ্রিক অভিজ্ঞতা" সম্পর্কে জিজ্ঞাসা করেছেন তবে আপনি যে একমাত্র উদাহরণ দিয়েছেন তা হ'ল এমন কোনও বিষয় যা সত্যিই কোনও আবশ্যক ভাষায় সমর্থিত নয় । প্রথম শ্রেণির নাগরিক হিসাবে ফাংশনগুলির আচরণ করা কার্যকরী প্রোগ্রামিংয়ের একটি সুন্দর কেন্দ্রীয় প্রজ্ঞা - যা বেশিরভাগ অপরিহার্য ভাষায় মানচিত্রের মানচিত্রে নয়।
ওনিওরিও ক্যাটেনাচি

2
@ কমরেডপি .: আপনার সম্পাদনা 2 সম্পর্কিত, এফএসআরপেক্স আন্তঃব্যবহারযোগ্যতাটিকে আরও নির্বোধ করার কিছু উপায় সরবরাহ করে। আপনি এই দুর্দান্ত ব্লগ পোস্টে কিছু ইঙ্গিত খুঁজে পেতে পারেন ।
প্যাড করুন

উত্তর:


40

ড্যানিয়েল ইতিমধ্যে ব্যাখ্যা করেছেন যে কীভাবে আপনি # F # ফাংশনটির সি # বান্ধব সংস্করণটি সংজ্ঞায়িত করবেন, তাই আমি কিছু উচ্চ-স্তরের মন্তব্য যুক্ত করব। প্রথমত, আপনার F # উপাদান ডিজাইন গাইডলাইনগুলি (ইতিমধ্যে গ্রেডবোট দ্বারা রেফারেন্স করা) পড়া উচিত । এটি এমন একটি নথি যা এফ # এবং .NET লাইব্রেরি এফ # ব্যবহার করে কীভাবে ডিজাইন করতে পারে তা ব্যাখ্যা করে এবং এটি আপনার অনেক প্রশ্নের উত্তর দেওয়া উচিত।

এফ # ব্যবহার করার সময়, দুটি ধরণের লাইব্রেরি আপনি লিখতে পারেন:

  • এফ # লাইব্রেরিটি কেবল এফ # থেকে ব্যবহারের জন্য ডিজাইন করা হয়েছে , সুতরাং এটি সর্বজনীন ইন্টারফেসটি একটি কার্যকরী শৈলীতে লেখা হয় (F # ফাংশনের ধরণ, টিউপলস, বৈষম্যমূলক ইউনিয়ন ইত্যাদি ব্যবহার করে)

  • .NET গ্রন্থাগারটি যে কোনও .NET ভাষা (সি # এবং এফ # সহ) ব্যবহার করার জন্য ডিজাইন করা হয়েছে এবং এটি সাধারণত। নেট অবজেক্ট-ভিত্তিক স্টাইল অনুসরণ করে। এর অর্থ হ'ল আপনি পদ্ধতি সহ ক্লাস হিসাবে বেশিরভাগ কার্যকারিতা উন্মোচিত করবেন (এবং কখনও কখনও এক্সটেনশন পদ্ধতি বা স্থির পদ্ধতি, তবে বেশিরভাগ কোড ওও ডিজাইনে লেখা উচিত)।

আপনার প্রশ্নে আপনি কীভাবে নেট নেট লাইব্রেরি হিসাবে ফাংশন রচনাটি প্রকাশ করবেন তা জিজ্ঞাসা করছেন তবে আমি মনে করি যে আপনার মত ফাংশনগুলি composeনেট নেট লাইব্রেরি দৃষ্টিকোণ থেকে খুব নিম্ন স্তরের ধারণাগুলি। আপনি তাদের সাথে কাজ পদ্ধতি যেমন প্রকাশ করতে পারে Funcএবং Action, কিন্তু যে সম্ভবত আপনি কীভাবে প্রথম স্থানে একটি স্বাভাবিক .NET গ্রন্থাগার ডিজাইন হবে নয় (সম্ভবত আপনি নির্মাতা প্যাটার্ন পরিবর্তে বা ওই জাতীয় কিছু ব্যবহার করতে চাই)।

কিছু ক্ষেত্রে (যেমন .NET লাইব্রেরী শৈলীর সাথে প্রকৃতপক্ষে উপযুক্ত নয় এমন সংখ্যাযুক্ত লাইব্রেরিগুলি ডিজাইন করার সময়), একটি লাইব্রেরিতে এফ # এবং .NET উভয় শৃঙ্খলা মিশ্রিত করে এমন একটি লাইব্রেরি ডিজাইন করা ভাল ধারণা দেয় । এটি করার সর্বোত্তম উপায় হ'ল স্বাভাবিক এফ # (বা স্বাভাবিক। নেট) এপিআই রাখা এবং তারপরে অন্য স্টাইলে প্রাকৃতিক ব্যবহারের জন্য মোড়ক সরবরাহ করা। মোড়কগুলি পৃথক নেমস্পেসে থাকতে পারে (লাইক MyLibrary.FSharpএবং MyLibrary)।

আপনার উদাহরণস্বরূপ, আপনি কিছু শ্রেণীর স্থির পদ্ধতি হিসাবে নেমস্পেসে MyLibrary.FSharp.NET (সি #-বান্ধব) মোড়ক (ড্যানিয়েল পোস্ট করা কোডের অনুরূপ) যুক্ত করতে পারেন then MyLibraryতবে আবার .NET লাইব্রেরিতে সম্ভবত ফাংশন কম্পোজিশনের চেয়ে আরও নির্দিষ্ট এপিআই থাকবে।


1
এফ # কম্পোনেন্ট ডিজাইনের গাইডলাইনগুলি এখন এখানে
জান শিফার

19

আপনাকে কেবল ফাংশনের মানগুলি (আংশিকভাবে প্রয়োগিত ফাংশনগুলি ইত্যাদির) সাথে মোড়তে হবে Funcবা Actionবাকিগুলি স্বয়ংক্রিয়ভাবে রূপান্তরিত হবে। উদাহরণ স্বরূপ:

type A(arg) =
  member x.Invoke(f: Func<_,_>) = f.Invoke(arg)

let a = A(1)
a.Invoke(fun i -> i + 1)

সুতরাং এটি যেখানে Func/ Actionপ্রযোজ্য তা বোধগম্য হয় । এটি কি আপনার উদ্বেগগুলি দূর করে? আমি মনে করি আপনার প্রস্তাবিত সমাধানগুলি অত্যধিক জটিল। আপনি আপনার সম্পূর্ণ লাইব্রেরি এফ # তে লিখতে পারেন এবং এফ # এবং সি # থেকে ব্যথামুক্ত ব্যবহার করতে পারেন (আমি এটি সবসময় করি)।

এছাড়াও, আন্তঃব্যবহারের দিক থেকে এফ # সি-এর চেয়ে আরও নমনীয়, তাই এটি যখন উদ্বেগের হয় তখন সাধারণত traditionalতিহ্যবাহী .NET স্টাইল অনুসরণ করা ভাল।

সম্পাদনা

পৃথক নেমস্পেসে দুটি পাবলিক ইন্টারফেস তৈরি করার জন্য প্রয়োজনীয় কাজটি আমার মনে হয়, কেবলমাত্র যখন তারা পরিপূরক হয় বা F # কার্যকারিতা সি # (যেমন ইনলাইনড ফাংশনগুলি, যা এফ #-স্পেসিফিক মেটাডেটার উপর নির্ভর করে) ব্যবহারযোগ্য না হয় কেবল তখনই তার প্রয়োজন হয়।

আপনার পয়েন্টগুলি ঘুরে:

  1. মডিউল + letবাইন্ডিং এবং কনস্ট্রাক্টর-কম টাইপ + স্ট্যাটিক সদস্য সি-তে ঠিক একই রকম দেখা যায়, তাই আপনি যদি পারেন তবে মডিউলগুলি নিয়ে যান। আপনি CompiledNameAttributeসদস্যদের সি # বন্ধুত্বপূর্ণ নাম দেওয়ার জন্য ব্যবহার করতে পারেন ।

  2. আমি ভুল হতে পারি, তবে আমার অনুমান যে System.Tupleকাঠামোর সাথে যুক্ত হওয়ার পূর্বে উপাদানগুলির দিকনির্দেশগুলি লিখিত হয়েছিল । (পূর্ববর্তী সংস্করণে এফ # এটা নিজস্ব tuple টাইপ সংজ্ঞায়িত।) যেহেতু আরও ব্যবহার করতে গ্রহণযোগ্য হয়ে এটা Tupleতুচ্ছ ধরনের জন্য একটি পাবলিক ইন্টারফেসে।

  3. এখান থেকে আমার মনে হয় আপনি সি # উপায়ে জিনিসগুলি করেছেন কারণ এফ # ভাল খেলেন Taskতবে সি # ভাল খেলেন না Async। আপনি অভ্যন্তরীণভাবে async ব্যবহার করতে পারেন তারপরে Async.StartAsTaskকোনও সর্বজনীন পদ্ধতি থেকে ফিরে আসার আগে কল করুন ।

  4. nullসি # থেকে ব্যবহারের জন্য একটি এপিআই বিকাশ করার সময় আলিঙ্গন করা একক বৃহত্তম ত্রুটি হতে পারে। পূর্বে, আমি অভ্যন্তরীণ এফ # কোড নাল বিবেচনা এড়াতে সব ধরণের কৌশল চেষ্টা করেছিলাম তবে শেষ পর্যন্ত, সর্বজনীন [<AllowNullLiteral>]নির্মাতাদের সাথে ধরণের চিহ্ন চিহ্নিত করা এবং নালটির জন্য আরোগুলি পরীক্ষা করা ভাল। এই ক্ষেত্রে এটি সি # এর চেয়ে খারাপ নয়।

  5. বৈষম্যমূলক ইউনিয়নগুলি সাধারণত শ্রেণিবৃত্তিতে সংকলিত হয় তবে সি # তে সর্বদা তুলনামূলকভাবে বন্ধুত্বপূর্ণ প্রতিনিধিত্ব থাকে। আমি বলব, তাদের চিহ্নিত করুন [<AllowNullLiteral>]এবং তাদের ব্যবহার করুন।

  6. ত্রিযুক্ত ফাংশনগুলি ফাংশন মান তৈরি করে , যা ব্যবহার করা উচিত নয়।

  7. আমি দেখতে পেলাম যে এটি জনসাধারণের ইন্টারফেসে ধরা পড়েছে এবং আভ্যন্তরীণভাবে তা উপেক্ষা করার উপর নির্ভর করে নালাকে আলিঙ্গন করা ভাল। YMMV।

  8. এটি অভ্যন্তরীণভাবে list/ map/ ব্যবহার করার জন্য অনেক জ্ঞান অর্জন করে set। সেগুলি সর্বজনীন ইন্টারফেসের মাধ্যমে প্রকাশিত হতে পারে IEnumerable<_>। এছাড়াও, seq, dict, এবং Seq.readonlyঘন ঘন দরকারী।

  9. # 6 দেখুন।

আপনি কোন কৌশলটি গ্রহণ করেন তা আপনার লাইব্রেরির ধরণ এবং আকারের উপর নির্ভর করে তবে আমার অভিজ্ঞতা অনুসারে, F # এবং C # এর মধ্যে মিষ্টি স্পটটি খুঁজে পেতে আলাদা এপিআই তৈরির চেয়ে দীর্ঘমেয়াদে কম কাজ প্রয়োজন required


হ্যাঁ আমি দেখতে পাচ্ছি যে জিনিসগুলিকে কাজ করার কিছু উপায় আছে, আমি পুরোপুরি নিশ্চিত নই। মডিউল পুনরায়। আপনার যদি module Foo.Bar.Zooসি # তে থাকে তবে class Fooএটি নেমস্পেসে থাকবে Foo.Bar। তবে যদি আপনার মতো নেস্টেড মডিউল থাকে তবে এটি অভ্যন্তরীণ ক্লাসগুলির সাথে module Foo=... module Bar=... module Zoo==শ্রেণি তৈরি করবে এবং । পুনরায় , যখন সত্যই আমাদের মানচিত্র এবং সেটগুলি নিয়ে কাজ করা দরকার তখন এটি গ্রহণযোগ্য হবে না। পুনরায় মান এবং - আমি এফ # পছন্দ করার একটি কারণ হ'ল আমি সি # তে ক্লান্ত হয়ে পড়েছি , সত্যিই এটির সাথে সবকিছু আবার কলুষিত করতে চাইবে না! FooBarZooIEnumerablenullAllowNullLiteralnull
ফিলিপ পি।

সাধারণত ইন্টারপ জন্য নেস্টেড মডিউলগুলির উপরে নেমস্পেসের পক্ষে। পুনরায়: নাল, আমি আপনার সাথে একমত, এটি অবশ্যই বিবেচনা করার জন্য এটি অবশ্যই একটি রিগ্রেশন, তবে আপনার এপিআই সি # থেকে ব্যবহার করা হবে কিনা এমন কিছু আপনাকে মোকাবেলা করতে হবে।
ড্যানিয়েল

2

যদিও এটি সম্ভবত একটি ওভারকিল হবে, আপনি মনো.সিসিল (এটি মেইলিং তালিকায় দুর্দান্ত সমর্থন রয়েছে) ব্যবহার করে একটি অ্যাপ্লিকেশন লেখার কথা বিবেচনা করতে পারেন যা আইএল স্তরে রূপান্তরটি স্বয়ংক্রিয়ভাবে ব্যবহার করবে। উদাহরণস্বরূপ, আপনি এফ # তে আপনার সমাবেশটি এফ # স্টাইল পাবলিক এপিআই ব্যবহার করে প্রয়োগ করেন, তারপরে সরঞ্জামটি তার উপর একটি সি # বন্ধুত্বপূর্ণ মোড়ক তৈরি করবে।

উদাহরণস্বরূপ, এফ # তে আপনি অবশ্যই সি # এর মতো ব্যবহার করার পরিবর্তে option<'T>( Noneবিশেষত) ব্যবহার করবেন null। এই দৃশ্যের জন্য একটি মোড়ক জেনারেটর লেখা মোটামুটি সহজ হওয়া উচিত: মোড়ক পদ্ধতিটি মূল পদ্ধতিটি গ্রহণ করবে: যদি এটির ফেরতের মান হয় Some x, তবে ফিরে xআসুন, অন্যথায় ফিরে আসুন null

যখন Tমান মান হয়, অর্থাত্ অ-অযোগ্য হয় তখন আপনাকে কেসটি পরিচালনা করতে হবে; আপনাকে মোড়কের পদ্ধতির রিটার্ন মানটি মুড়ে দিতে হবে Nullable<T>, যা এটি কিছুটা বেদনাদায়ক করে তোলে।

আবার, আমি নিশ্চিত যে এটি আপনার দৃশ্যে এ জাতীয় একটি সরঞ্জাম লেখার জন্য অর্থ প্রদান করবে, আপনি যদি এই জাতীয় লাইব্রেরিতে (এফ # এবং সি # উভয় থেকে নির্বিঘ্নে ব্যবহারযোগ্য) নিয়মিত কাজ করছেন তবে ব্যতীত। যাই হোক না কেন, আমি মনে করি এটি একটি আকর্ষণীয় পরীক্ষা হবে, এটি একটি আমি এমনকি কখনও কখনও অন্বেষণ করতে পারি।


আকর্ষণীয় শোনাচ্ছে। ব্যবহার হায় Mono.Cecilগড় মূলত একটি প্রোগ্রাম লেখা এফ # সমাবেশ লোড করতে, ম্যাপিং প্রয়োজন আইটেম খুঁজে, এবং তাদের সি শার্প চাদরে সাথে অন্য সমাবেশ emitting? আমি কি এই অধিকার পেয়েছি?
ফিলিপ পি।

@ কমরেড পি .: আপনি এটিও করতে পারেন, তবে এটি আরও জটিল, কারণ তখন আপনাকে নতুন সমাবেশের সদস্যদের নির্দেশ করার জন্য সমস্ত তথ্যসূত্রগুলি সামঞ্জস্য করতে হবে। যদি আপনি কেবলমাত্র বিদ্যমান সদস্য # # রচিত সমাবেশে নতুন সদস্যদের (মোড়কে) যুক্ত করেন তবে এটি অনেক সহজ।
ShdNx

2

খসড়া এফ # অংশের নকশার নির্দেশিকা (আগস্ট 2010)

ওভারভিউ এই ডকুমেন্টটি F # উপাদান ডিজাইন এবং কোডিং সম্পর্কিত কিছু সমস্যা দেখে at বিশেষত, এটি কভার করে:

  • "ভ্যানিলা" ডিজাইন করার জন্য গাইডলাইনস। যে কোনও নেট ভাষা থেকে ব্যবহারের জন্য নেট লাইব্রেরি।
  • এফ #-থেকে-এফ # লাইব্রেরি এবং এফ # বাস্তবায়ন কোডের জন্য নির্দেশিকা।
  • এফ # বাস্তবায়ন কোডের জন্য কোডিং কনভেনশন সম্পর্কিত পরামর্শ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.