টাইপ-ভিত্তিক আক্রমণকারীদের কার্যকরী প্রোগ্রামিংয়ের উত্তর কী?


9

আমি সচেতন যে একাধিক প্রোগ্রামিং প্যারাডিম জুড়ে আক্রমণকারীদের ধারণাটি বিদ্যমান। উদাহরণস্বরূপ, লুপ আক্রমণকারীরা ওও, ক্রিয়ামূলক এবং পদ্ধতিগত প্রোগ্রামিংয়ে প্রাসঙ্গিক।

তবে, ওওপিতে পাওয়া যায় এমন একটি খুব দরকারী ধরণ হ'ল একটি নির্দিষ্ট ধরণের ডেটার আক্রমণকারী। এটিই আমি শিরোনামে "টাইপ-ভিত্তিক আক্রমণকারী" বলছি। উদাহরণস্বরূপ, একটি Fractionপ্রকারের আক্রমণকারীর সাথে একটি হতে পারে numeratorএবং denominatorতাদের জিসিডি সর্বদা 1 থাকে (অর্থাত্ ভগ্নাংশটি হ্রাস আকারে থাকে)। আমি কেবল এইরকম কিছু ধরণের এনক্যাপসুলেশন করে গ্যারান্টি দিতে পারি, এর ডেটা অবাধে সেট না করে। বিনিময়ে, আমাকে কখনই এটি হ্রাস হয়েছে কিনা তা খতিয়ে দেখতে হবে না, তাই আমি সমতা পরীক্ষার মতো অ্যালগোরিদমগুলিকে সহজ করতে পারি।

অন্যদিকে, আমি যদি কেবল Fractionএনক্যাপসুলেশনের মাধ্যমে এই গ্যারান্টিটি সরবরাহ না করে কোনও প্রকারের ঘোষণা করি তবে আমি নিরাপদে এই ধরণের কোনও ফাংশন লিখতে পারি না যা ধরে নিয়েছে যে ভগ্নাংশটি হ্রাস পেয়েছে, কারণ ভবিষ্যতে অন্য কেউ আসতে পারে এবং কোনও উপায় যুক্ত করতে পারে একটি অ-হ্রাস ভগ্নাংশ ধরে রাখা।

সাধারণত, এই ধরণের আক্রমণকারীের অভাব হতে পারে:

  • প্রাক-শর্ত হিসাবে আরও জটিল অ্যালগরিদমগুলি একাধিক জায়গায় পরীক্ষা করা / নিশ্চিত করা দরকার
  • এই পুনরাবৃত্ত পূর্ব শর্তগুলি একইভাবে অন্তর্নিহিত জ্ঞানের প্রতিনিধিত্ব করে বলে DRY লঙ্ঘন (যে আক্রমণকারী সত্য হওয়া উচিত)
  • সংকলন-সময়ের গ্যারান্টি না দিয়ে রানটাইম ব্যর্থতার মাধ্যমে প্রাক-শর্তগুলি প্রয়োগ করা

সুতরাং আমার প্রশ্নটি হ'ল এই ধরণের আক্রমণকারীটির কার্যকরী প্রোগ্রামিংয়ের উত্তর। কম-বেশি একই জিনিস অর্জনের কোনও কার্যকরী-মূ ?় উপায় আছে? বা কার্যকরী প্রোগ্রামিংয়ের এমন কোনও দিক রয়েছে যা উপকারগুলি কম প্রাসঙ্গিক করে তোলে?


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

@ ক্যাক_আমি সচেতন এফ # এটি করতে পারে (যদিও আইআইআরসি এর জন্য কিছুটা ছোটখাটো কুঁচকানো দরকার) এবং অনুমান করা হয়েছে স্কালা অন্য ক্রস-দৃষ্টান্তের ভাষা হিসাবে পারে। আকর্ষণীয় যে হাসেল এটি করতে পারে - একটি লিঙ্ক পেয়েছে? আমি যা খুঁজছি তা হ'ল কোনও বৈশিষ্ট্য সরবরাহকারী নির্দিষ্ট ভাষাগুলির চেয়ে কার্যকরী-মুশকিল উত্তর। আপনি অবশ্যই মূর্খতাবোধক বিষয় সম্পর্কে কথা বলা শুরু করার পরে অবশ্যই জিনিসগুলি অস্পষ্ট এবং বিষয়গত হয়ে উঠতে পারে, এ কারণেই আমি এটিকে প্রশ্ন থেকে দূরে রেখেছি।
বেন অ্যারনসন 21'15

সংকলন-পূর্ববর্তী সময়ে পূর্ব শর্ত পরীক্ষা করা যায় না এমন ক্ষেত্রে কন্সট্রাক্টরের সাথে যাচাই করা বুদ্ধিমানের কাজ। একটি PrimeNumberক্লাস বিবেচনা করুন । প্রতিটি ক্রিয়াকলাপের জন্য আদিমতার জন্য একাধিক রিলান্ড্যান্ট চেক করা খুব ব্যয়বহুল হবে, তবে এটি কোনও ধরণের পরীক্ষা নয় যা সংকলন-সময় সম্পাদন করা যেতে পারে। (অপারেশন অনেক আপনি মৌলিক সংখ্যার উপর সম্পাদন করতে, বলতে গুণ চাই, একটি ফর্ম না অবসান মন্তব্য পোস্ট যেহেতু আমি কার্যকরী প্রোগ্রামিং নিজেকে জানি না হিসাবে, অর্থাত ফলাফল সম্ভবত মৌলিক নিশ্চিত করা হয় না
rwong

একটি আপাতদৃষ্টিতে সম্পর্কিত নয় এমন প্রশ্ন, কিন্তু ... জমিদারি বা ইউনিট পরীক্ষা আরও গুরুত্বপূর্ণ?
rwong

@ রওং হ্যাঁ, সেখানে কিছু চমৎকার উদাহরণ। যদিও আপনি কোন চূড়ান্ত পয়েন্টে গাড়ি চালাচ্ছেন তা আসলে আমি 100% পরিষ্কার নই।
বেন অ্যারনসন

উত্তর:


2

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

ওসিএএমএলে বিমূর্ত ডেটা প্রকার

ওক্যামেলে মডিউলগুলি একটি প্রোগ্রাম গঠনের জন্য ব্যবহৃত হয়। একটি মডিউলটির একটি বাস্তবায়ন এবং একটি স্বাক্ষর থাকে , পরবর্তীটি মডিউলে সংজ্ঞায়িত মান এবং প্রকারের সংক্ষিপ্তসারগুলির একরকম হয়, যখন প্রাক্তন প্রকৃত সংজ্ঞা দেয়। এটি .c/.hসি প্রোগ্রামারদের সাথে পরিচিত ডিপটিচের সাথে আলগাভাবে তুলনা করা যেতে পারে ।

উদাহরণ হিসাবে, আমরা Fractionমডিউলটি এর মতো প্রয়োগ করতে পারি :

# module Fraction = struct
  type t = Fraction of int * int
  let rec gcd a b =
    match a mod b with
    | 0 -> b
    | r -> gcd b r

  let make a b =
   if b = 0 then
     invalid_arg "Fraction.make"
   else let d = gcd (abs a) (abs b) in
     Fraction(a/d, b/d)

  let to_string (Fraction(a,b)) =
    Printf.sprintf "Fraction(%d,%d)" a b

  let add (Fraction(a1,b1)) (Fraction(a2,b2)) =
    make (a1*b2 + a2*b1) (b1*b2)

  let mult (Fraction(a1,b1)) (Fraction(a2,b2)) =
    make (a1*a2) (b1*b2)
end;;

module Fraction :
  sig
    type t = Fraction of int * int
    val gcd : int -> int -> int
    val make : int -> int -> t
    val to_string : t -> string
    val add : t -> t -> t
    val mult : t -> t -> t
  end

এই সংজ্ঞাটি এখন এটির মতো ব্যবহার করা যেতে পারে:

# Fraction.add (Fraction.make 8 6) (Fraction.make 14 21);;
- : Fraction.t = Fraction.Fraction (2, 1)

যে কোনও তৈরির সুরক্ষা নেটটিকে বাইপাস করে সরাসরি ভগ্নাংশের মানগুলি তৈরি করতে পারে Fraction.make:

# Fraction.Fraction(0,0);;
- : Fraction.t = Fraction.Fraction (0, 0)

এটি প্রতিরোধ করতে, এই জাতীয় প্রকারের কংক্রিট সংজ্ঞাটি লুকানো সম্ভব Fraction.t:

# module AbstractFraction : sig
  type t
  val make : int -> int -> t
  val to_string : t -> string
  val add : t -> t -> t
  val mult : t -> t -> t
end = Fraction;;

module AbstractFraction :
sig
  type t
  val make : int -> int -> t
  val to_string : t -> string
  val add : t -> t -> t
  val mult : t -> t -> t
end

একটি তৈরির একমাত্র উপায় AbstractFraction.tহ'ল AbstractFraction.makeফাংশনটি ব্যবহার করা ।

স্কিমটিতে বিমূর্ত ডেটা প্রকার

ওসিএএমএলের মতো স্কিম ল্যাঙ্গুয়েজে বিমূর্ত ডেটা ধরণের একই প্রক্রিয়া নেই। এটি এনক্যাপসুলেশন অর্জনের জন্য "কার্পেটের নীচে তাকাচ্ছেন না" ব্যবহারকারীর উপর নির্ভর করে।

স্কিমে, fraction?ইনপুটটি বৈধ করার সুযোগ দেওয়ার মানগুলিকে স্বীকৃতি দেওয়ার মতো পূর্বাভাসগুলি সংজ্ঞায়িত করার প্রথাগত । আমার অভিজ্ঞতায় প্রভাবশালী ব্যবহার হ'ল প্রতিটি লাইব্রেরি কলের ইনপুটকে বৈধতা দেওয়ার পরিবর্তে যদি কোনও মান ভুলে যায় তবে ব্যবহারকারীকে তার ইনপুটটি বৈধতা দেওয়া উচিত।

প্রত্যাবর্তিত মানগুলির বিমূর্ততা প্রয়োগ করার জন্য বেশ কয়েকটি কৌশল রয়েছে যেমন লাইব্রেরি দ্বারা পরিচালিত একটি পুলের ক্ষেত্রে প্রয়োগের সময় মান দেয় বা প্রয়োগ করে যখন মান দেয় তবে তা আমি বাস্তবে কখনও দেখিনি।


+1 এটিও উল্লেখযোগ্য যে সমস্ত ওও ভাষাগুলি এনক্যাপসুলেশন প্রয়োগ করে না।
মাইকেল শ 16

5

এনক্যাপসুলেশন এমন কোনও বৈশিষ্ট্য নয় যা ওওপির সাথে আসে। যে কোনও ভাষা যথাযথ মডুলারাইজেশন সমর্থন করে এটিতে এটি রয়েছে।

হাস্কেল এ আপনি এটি কীভাবে করেন তা এখানে রয়েছে:

-- Rational.hs
module Rational (
    -- This is the export list. Functions not in this list aren't visible to importers.
    Rational, -- Exports the data type, but not its constructor.
    ratio,
    numerator,
    denominator
    ) where

data Rational = Rational Int Int

-- This is the function we provide for users to create rationals
ratio :: Int -> Int -> Rational
ratio num den = let (num', den') = reduce num den
                 in Rational num' den'

-- These are the member accessors
numerator :: Rational -> Int
numerator (Rational num _) = num

denominator :: Rational -> Int
denominator (Rational _ den) = den

reduce :: Int -> Int -> (Int, Int)
reduce a b = let g = gcd a b
             in (a `div` g, b `div` g)

এখন, যৌক্তিক তৈরি করতে, আপনি অনুপাতের ফাংশনটি ব্যবহার করেন যা আক্রমণকারীটিকে কার্যকর করে। ডেটা অপরিবর্তনীয় হওয়ায় আপনি পরে আক্রমণকারীকে লঙ্ঘন করতে পারবেন না।

যদিও এটি আপনার জন্য কিছু ব্যয় করে: ব্যবহারকারী এবং ডুমিনেটর ব্যবহারকারীর মতো একই ডিকনস্ট্রাকচার ঘোষণাটি ব্যবহার করা আর সম্ভব হয় না।


4

আপনি এটি একইভাবে করেন: একটি কনস্ট্রাক্টর তৈরি করুন যা সীমাবদ্ধতা প্রয়োগ করে এবং আপনি যখনই কোনও নতুন মান তৈরি করেন তখন সেই কনস্ট্রাক্টরটি ব্যবহার করতে সম্মত হন।

multiply lhs rhs = ReducedFraction (lhs.num * rhs.num) (lhs.denom * rhs.denom)

কিন্তু কার্ল, ওওপিতে আপনাকে কনস্ট্রাক্টর ব্যবহার করতে সম্মত হতে হবে না। ওহ সত্যিই?

class Fraction:
  ...
  Fraction multiply(Fraction lhs, Fraction rhs):
    Fraction result = lhs.clone()
    result.num *= rhs.num
    result.denom *= rhs.denom
    return result

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


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

@ বেনআরনসন একটি আক্রমণকারী "প্রয়োগ করা" এবং "প্রচার" করার মধ্যে একটি পার্থক্য লক্ষ্য করুন ।
রোবং

1
+1 টি। এই কৌশলটি এফপিতে আরও বেশি শক্তিশালী কারণ অপরিবর্তনীয় মানগুলি পরিবর্তন হয় না; সুতরাং আপনি তাদের সম্পর্কে "একবার এবং সর্বদা" প্রকারের ব্যবহারগুলি প্রমাণ করতে পারেন। পরিবর্তনীয় অবজেক্টের সাথে এটি সম্ভব নয় কারণ তাদের ক্ষেত্রে এখন যা সত্য তা পরে সত্য হতে পারে না; সেরা আপনি ডিফেন্সিয়ালি করতে পারেন অবজেক্টের অবস্থা পুনরায় পরীক্ষা করে।
ডোভাল

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

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