রাষ্ট্রীয় লাইব্রেরির শীর্ষে সাইড এফেক্ট-মুক্ত ইন্টারফেস


16

জন হিউজের সাথে একটি সাক্ষাত্কারে যেখানে তিনি এরলং এবং হাস্কেল সম্পর্কে আলোচনা করেছেন, এরলংয়ের রাষ্ট্রীয় গ্রন্থাগার ব্যবহারের বিষয়ে তাঁর নীচের কথাটি রয়েছে:

যদি আমি একটি রাষ্ট্রীয় গ্রন্থাগার ব্যবহার করতে চাই, আমি সাধারণত এর উপরে একটি পার্শ্ব প্রতিক্রিয়া-মুক্ত ইন্টারফেস তৈরি করি যাতে আমি আমার বাকী কোডে নিরাপদে এটি ব্যবহার করতে পারি।

তিনি এই বলতে কি বুঝায়? এটি কীভাবে দেখাবে তার একটি উদাহরণ আমি ভাবার চেষ্টা করছি তবে আমার কল্পনা এবং / বা জ্ঞান আমাকে ব্যর্থ করছে।


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

উত্তর:


12

(আমি এরলংকে চিনি না, এবং আমি হাস্কেল লিখতে পারি না, তবে আমি মনে করি আমি তবুও উত্তর দিতে পারি)

ঠিক আছে, সেই সাক্ষাত্কারে একটি এলোমেলো সংখ্যা জেনারেশন লাইব্রেরির উদাহরণ দেওয়া হয়েছে। এখানে একটি সম্ভাব্য রাষ্ট্রীয় ইন্টারফেস:

# create a new RNG
var rng = RNG(seed)

# every time we call the next(ceil) method, we get a new random number
print rng.next(10)
print rng.next(10)
print rng.next(10)

আউটপুট হতে পারে 5 2 7। যে কেউ অপরিবর্তনীয়তা পছন্দ করে, তার পক্ষে এটি সম্পূর্ণ ভুল! এটি হওয়া উচিত 5 5 5, কারণ আমরা একই বস্তুটিতে পদ্ধতিটি বলেছি।

একটি রাষ্ট্রহীন ইন্টারফেস কি হবে? অলসভাবে মূল্যায়ন করা তালিকা হিসাবে আমরা এলোমেলো সংখ্যার ক্রম দেখতে পারি, যেখানে nextআসলে মাথাটি পুনরুদ্ধার করা হয়:

let rng = RNG(seed)
let n : rng = rng in
  print n
  let n : rng = rng in
    print n
    let n : rng in
      print n

এই জাতীয় ইন্টারফেসের সাহায্যে আমরা সর্বদা পূর্বের অবস্থায় ফিরে যেতে পারি। যদি আপনার কোডের দুটি টুকরা একই আরএনজিকে বোঝায়, তারা আসলে সংখ্যার একই ক্রম পাবে। কার্যক্ষম মানসিকতায় এটি অত্যন্ত কাম্য।

রাষ্ট্রীয় ভাষায় এটি প্রয়োগ করা এত জটিল নয়। উদাহরণ স্বরূপ:

import scala.util.Random
import scala.collection.immutable.LinearSeq

class StatelessRNG (private val statefulRNG: Random, bound: Int) extends LinearSeq[Int] {
  private lazy val next = (statefulRNG.nextInt(bound), new StatelessRNG(statefulRNG, bound))

  // the rest is just there to satisfy the LinearSeq trait
  override def head = next._1
  override def tail = next._2
  override def isEmpty = false
  override def apply(i: Int): Int = throw new UnsupportedOperationException()
  override def length = throw new UnsupportedOperationException()
}

// print out three nums
val rng = new StatelessRNG(new Random(), 10)
rng.take(3) foreach (n => println(n))

একবার আপনি কিছুটা সিনট্যাকটিক চিনি যুক্ত করুন যাতে এটি তালিকার মতো মনে হয়, এটি আসলে বেশ সুন্দর।


1
আপনার প্রথম উদাহরণ হিসাবে: rnd.next (10) প্রতিবার বিভিন্ন মান উত্পাদন করে অপরিবর্তনীয়তার সাথে তেমন কিছু করতে হয় না যেমন এটি কোনও ফাংশনের সংজ্ঞা দিয়ে থাকে: ফাংশনগুলি অবশ্যই 1-থেকে -1 হওয়া উচিত। (+1 তবে ভাল স্টাফ)
স্টিভেন ইভার্স

ধন্যবাদ! এটি ছিল সত্যই একটি সুন্দর, দৃ .় ব্যাখ্যা এবং উদাহরণ।
বিটা

1

এখানে একটি মূল ধারণাটি হ'ল বাহ্যিক পরিবর্তনশীল রাষ্ট্র । কোনও লাইব্রেরি যার কোনও বাহ্যিক পরিবর্তনযোগ্য অবস্থা নেই, সেগুলি পার্শ্ব প্রতিক্রিয়া মুক্ত। এই ধরনের একটি লাইব্রেরির প্রতিটি ক্রিয়াকলাপ কেবল এতে যুক্ত হওয়া যুক্তির উপর নির্ভর করে।

  • যদি আপনার ফাংশন কোনও উত্স অ্যাক্সেস করে যা এটি দ্বারা তৈরি করা হয়নি, এটি দেওয়া (অর্থাত্ প্যারামিটার হিসাবে), তবে এটি বাহ্যিক অবস্থার উপর নির্ভর করে ।
  • যদি আপনার ফাংশন এমন কিছু তৈরি করে যা কলারের কাছে ফিরে না যায় (এবং এটি ধ্বংস করে না) তবে আপনার ফাংশনটি বাহ্যিক অবস্থা তৈরি করছে।
  • যখন উপরে থেকে বাহ্যিক রাষ্ট্রের বিভিন্ন সময়ে বিভিন্ন মান থাকতে পারে, তবে তা পরিবর্তনযোগ্য

আমি ব্যবহৃত হ্যান্ডি লিটমাস টেস্টগুলি:

  • যদি ফাংশন A এর আগে ফাংশন বি চালানোর দরকার হয় তবে এ বহিরাগত অবস্থা তৈরি করে যা বি নির্ভর করে।
  • আমি যে ফাংশনটি লিখছি তা যদি স্মৃতিচারণ করা যায় না, তবে এটি বাহ্যিক পরিবর্তনীয় স্থিতির উপর নির্ভর করে। (স্মৃতিচারণের কারণে স্মৃতিচারণ কোনও ভাল ধারণা নাও হতে পারে তবে এটি এখনও সম্ভব হওয়া উচিত)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.