(বা কেন নয়) অস্তিত্বমূলক প্রকারগুলি কার্যকরী প্রোগ্রামিংয়ে খারাপ অনুশীলন হিসাবে বিবেচিত হয়?


43

অবিচ্ছিন্ন প্রকারের উপর নির্ভরতা অপসারণ করার জন্য ধারাবাহিকভাবে রিফ্যাক্টর কোড ব্যবহার করতে আমি কী কী কৌশল ব্যবহার করতে পারি? সাধারণত এগুলি আপনার ধরণের অনাকাঙ্ক্ষিত নির্মাণকে অযোগ্য ঘোষণা করার পাশাপাশি প্রদত্ত প্রকার সম্পর্কে ন্যূনতম জ্ঞানের সাথে গ্রাহককে মঞ্জুরি দেওয়ার জন্য ব্যবহার করা হয় (বা এটি আমার বোঝাপড়া)।

কোডের উপর নির্ভরতা অপসারণের জন্য কি কেউ সহজ সামঞ্জস্যপূর্ণ উপায় নিয়ে এসেছেন যা এখনও কিছু সুবিধা বজায় রাখে? অথবা কোনও বিমূর্ততায় পিছলে যাওয়ার কোনও উপায় যা পরিবর্তনের সাথে মোকাবিলা করার জন্য উল্লেখযোগ্য কোড মন্থনের প্রয়োজন ছাড়াই তাদের অপসারণের অনুমতি দেয়?

আপনি অস্তিত্বের ধরণের সম্পর্কে এখানে আরও পড়তে পারেন ("যদি আপনি সাহস করেন ..")।


8
@ রবার্টহারভে আমি এমন একটি ব্লগ পোস্ট পেয়েছি যা আমাকে এই প্রশ্নটি সম্পর্কে প্রথমবার ভাবতে বাধ্য করেছে: হাস্কেল অ্যান্টিপ্যাটার্টার: অস্তিত্বীয় টাইপক্লাস । এছাড়াও, জোয়ে অ্যাডামস পত্রিকায় বিভাগ ৩.১-এ অস্তিত্বের কিছু সমস্যা রয়েছে বলে বর্ণনা করেছে। যদি আপনার বিপরীত যুক্তি থাকে তবে দয়া করে সেগুলি ভাগ করুন।
পেটর পুডলিক

5
@ পেটরপুদলক: মনে রাখবেন যে অ্যান্টিপ্যাটার্নগুলি সাধারণভাবে অস্তিত্বমূলক প্রকারভেদ নেই, তবে সাধারণ এবং সহজ কিছু (এবং হাস্কেলের পক্ষে আরও ভাল সমর্থিত) যখন একই কাজ করবে তখন সেগুলির একটি নির্দিষ্ট ব্যবহার।
সিএ ম্যাকক্যান

10
যদি আপনি জানতে চান যে কোনও নির্দিষ্ট ব্লগ পোস্টের লেখক কেন একটি মতামত প্রকাশ করেছেন তবে আপনার সম্ভবত জিজ্ঞাসা করা উচিত ব্যক্তি তিনি লেখক।
এরিক লিপার্ট

6
@ টলেমি এটি মতের বিষয়। কয়েক বছর ধরে হ্যাস্কেল ব্যবহার করে, আমি শক্তিশালী টাইপ সিস্টেম নেই এমন কার্যকরী ভাষা ব্যবহারের কথা কল্পনাও করতে পারি না।
পেটর পুডলক

4
@ টলেমি: হাস্কেলের মন্ত্রটি "যদি এটি কম্পাইল করে এটি কাজ করে", এর্ল্যাংস মন্ত্রটি "এটি ক্রাশ হতে দিন"। গতিশীল টাইপিং একটি আঠালো হিসাবে ভাল, কিন্তু আমি ব্যক্তিগতভাবে কেবল আঠালো ব্যবহার করে জিনিসগুলি তৈরি করতাম না।
ডেন

উত্তর:


8

অস্তিত্বমূলক প্রকারগুলি কার্যকরী প্রোগ্রামিংয়ে খারাপ অভ্যাস হিসাবে বিবেচিত হয় না। আমি মনে করি আপনাকে কী ট্রিপ করছে তা হ'ল অস্তিত্বের জন্য সর্বাধিক উল্লেখযোগ্য ব্যবহার হ'ল অস্তিত্বের টাইপক্লাস অ্যান্টিপ্যাটার্ন , যা অনেকে বিশ্বাস করেন যে এটি খারাপ অভ্যাস।

এই ধরণটি প্রায়শই বিজাতীয়ভাবে টাইপ করা উপাদানের একটি তালিকা থাকা উচিত যা সমস্ত একই টাইপক্লাস প্রয়োগ করে। উদাহরণস্বরূপ, Showউদাহরণগুলির সাথে মানগুলির একটি তালিকা থাকতে পারে :

{-# LANGUAGE ExistentialTypes #-}

class Shape s where
   area :: s -> Double

newtype Circle = Circle { radius :: Double }
instance Shape Circle where
   area (Circle r) = pi * r^2

newtype Square = Square { side :: Double }
    area (Square s) = s^2

data AnyShape = forall x. Shape x => AnyShape x
instance Shape AnyShape where
    area (AnyShape x) = area x

example :: [AnyShape]
example = [AnyShape (Circle 1.0), AnyShape (Square 1.0)]

এর মতো কোডের সমস্যাটি হ'ল:

  1. আপনি কেবলমাত্র কার্যকর ক্রিয়াকলাপটি করতে পারেন AnyShapeতার অঞ্চলটি পাওয়া।
  2. AnyShapeআকারের আকারগুলির মধ্যে একটি আনতে আপনাকে এখনও কনস্ট্রাক্টর ব্যবহার করতে হবে AnyShape

দেখা যাচ্ছে যে, এই টুকরোটি কোডটি আপনাকে এমন কিছু দেয় না যা এই ছোট্টটি দেয় না:

class Shape s where
   area :: s -> Double

newtype Circle = Circle { radius :: Double }
instance Shape Circle where
   area (Circle r) = pi * r^2

newtype Square = Square { side :: Double }
    area (Square s) = s^2

example :: [Double]
example = [area (Circle 1.0), area (Square 1.0)]

মাল্টি-মেথড ক্লাসগুলির ক্ষেত্রে, একই পদ্ধতি সাধারণত "পদ্ধতিগুলির রেকর্ড" এনকোডিং ব্যবহার করে আরও সহজভাবে সম্পাদন করা যায় like টাইপক্লাসের মতো ব্যবহারের পরিবর্তে Shape, আপনি একটি রেকর্ড টাইপ সংজ্ঞায়িত করেন যার ক্ষেত্রগুলি "পদ্ধতির" Shapeধরণের হয় , এবং আপনি আপনার চেনাশোনা এবং স্কোয়ারগুলিকে এসগুলিতে রূপান্তর করতে ফাংশন লিখেন Shape


তবে এর অর্থ এই নয় যে অস্তিত্বের ধরণগুলি একটি সমস্যা! উদাহরণস্বরূপ, মরিচে তাদের বৈশিষ্ট্যযুক্ত বস্তু নামে একটি বৈশিষ্ট্য রয়েছে যা লোকেরা প্রায়শই একটি বৈশিষ্ট্যের উপরে অস্তিত্বের ধরণ হিসাবে বর্ণনা করে (মরিচের ধরণের সংস্করণের সংস্করণ)। যদি অস্তিত্বের টাইপক্লাসগুলি হাস্কেলের একটি অ্যান্টিপ্যাটার্ন হয়, তার মানে কি এই যে মরিচা একটি খারাপ সমাধান বেছে নিয়েছে? না! হাস্কেল বিশ্বে প্রেরণা মূলত নীতি সম্পর্কে নয়, বাক্য গঠন এবং সুবিধার্থে।

এই নির্বাণ একটি আরো গাণিতিক পথ নির্দেশ করা হয় যে AnyShapeউপরে এবং থেকে টাইপ Doubleহয় isomorphic কিছু আছে তাদের মধ্যে একটি "অবচয়হীন রূপান্তর" (ভাল, পয়েন্ট স্পষ্টতা ভাসমান জন্য সংরক্ষণ করুন) হল:

forward :: AnyShape -> Double
forward = area

backward :: Double -> AnyShape
backward x = AnyShape (Square (sqrt x))

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


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

সুতরাং সাধারণ উত্তরটি হ'ল কোনও সাধারণ উত্তর নেই। অস্তিত্বমূলক প্রকারের ব্যবহারগুলি কেবলমাত্র প্রসঙ্গে বিচার করা যেতে পারে different এবং বিভিন্ন ভাষায় কী বৈশিষ্ট্য এবং বাক্য গঠনটি সরবরাহ করা হয়েছে তার উপর নির্ভর করে উত্তরগুলি পৃথক হতে পারে।


এটি কোনও আইসোমরফিজম নয়।
রায়ান রিচ

2

আমি হাস্কেলের সাথে খুব বেশি পরিচিত নই, তাই আমি নন-একাডেমিক ক্রিয়ামূলক সি # বিকাশকারী হিসাবে প্রশ্নের সাধারণ অংশটির উত্তর দেওয়ার চেষ্টা করব।

কিছু পড়া করার পরে, এটি সক্রিয় যে:

  1. জাভা ওয়াইল্ডকার্ড অস্তিত্বের ধরণের সাথে সমান:

    উদাহরণস্বরূপ স্কালার অস্তিত্বের ধরণের এবং জাভার ওয়াইল্ডকার্ডের মধ্যে পার্থক্য

  2. ওয়াইল্ডকার্ডগুলি সি # তে সম্পূর্ণরূপে প্রয়োগ করা হয় না: জেনেরিক বৈকল্পিকতা সমর্থিত, তবে কল সাইটের বৈকল্পিকতাটি নয়:

    সি # জেনারিক্স: ওয়াইল্ডকার্ডস

  3. আপনার এই বৈশিষ্ট্যটি প্রতিদিন প্রয়োজন নাও হতে পারে তবে আপনি যখন এটি অনুভব করবেন তখন (যেমন জিনিসগুলিকে কাজ করার জন্য কোনও অতিরিক্ত ধরণের প্রবর্তন করা):

    সি # জেনেরিক সীমাবদ্ধতায় ওয়াইল্ডকার্ডস

এই তথ্যের উপর ভিত্তি করে অস্তিত্বমূলক প্রকার / ওয়াইল্ডকার্ডগুলি যথাযথভাবে প্রয়োগ করার সময় কার্যকর হয় এবং সেগুলিতে তাদের সাথে কোনও ভুল হয় না, তবে সম্ভবত তারা অন্যান্য ভাষার বৈশিষ্ট্যগুলির মতোই অপব্যবহার করতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.