কার্যকরী প্রোগ্রামিং পঠনযোগ্যতা [বন্ধ]


13

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

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

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


1
আমার মনে আছে "সুপার নারিও ব্রাদার্স" এসএনএন কোডেপ্রেস.আর.এস.এসএ / শ্যাং / আংজেল / নরারিওর কোডটি যখন আমি সবেমাত্র কার্যকরী প্রোগ্রামিং সম্পর্কে কিছু জানতাম এবং 'ওয়াও চিন্তাভাবনা মনে করি। এটি সত্যিই পঠনযোগ্য বলে মনে হচ্ছে '
WuHoUnited



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

উত্তর:


15

কোড পঠনযোগ্যতা খুব বিষয়গত । এ কারণে, বিভিন্ন লোক একই কোডটিকে পঠনযোগ্য বা অপঠনযোগ্য বিবেচনা করবে।

একটি অ্যাসাইনমেন্ট, x = x + 1একজন গণিতজ্ঞের কাছে অদ্ভুত শোনায় কারণ একটি অ্যাসাইনমেন্ট বিভ্রান্তিকরভাবে তুলনা করার মতো দেখায়।

যারা এই নিদর্শনগুলির সাথে পরিচিত নয় তাদের পক্ষে একটি সাধারণ ওওপি নকশার ধরণটি সম্পূর্ণ অস্পষ্ট হবে। সিঙ্গলটন বিবেচনা করুন । কেউ জিজ্ঞাসা করবে "আমার ব্যক্তিগত নির্মাতার দরকার কেন? রহস্যজনক পদ্ধতিটি getInstance() কী? আমরা কেন বিশ্বব্যাপী পরিবর্তনশীল করে সেখানে কোনও বস্তু বরাদ্দ করি না?"

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

এটি বলার পরে, আপনার বুঝতে হবে যে এফপি রূপালী বুলেট নয়। অনেকগুলি অ্যাপ্লিকেশন রয়েছে যেখানে এফপি প্রয়োগ করা কঠিন হবে এবং তাই এটি আরও খারাপ পাঠযোগ্য কোডে নিয়ে যাবে


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

12

সংক্ষিপ্ত উত্তর:

যে উপাদানগুলিকে লোকেরা বলে যে ফাংশনাল প্রোগ্রামিং কোডটি পড়া মুশকিল তা হ'ল এটি আরও কমপ্যাক্ট সিনট্যাক্সকে অগ্রাধিকার দেয়।

দীর্ঘ উত্তর:

কার্যকরী প্রোগ্রামিং নিজেই পঠনযোগ্য বা অপঠনযোগ্য হতে পারে না, কারণ এটি একটি দৃষ্টান্ত, লেখার কোডের স্টাইল নয়। সি # তে উদাহরণস্বরূপ, কার্যকরী প্রোগ্রামিং দেখে মনে হচ্ছে:

return this.Data.Products
    .Where(c => c.IsEnabled)
    .GroupBy(c => c.Category)
    .Select(c => new PricesPerCategory(category: c.Key, minimum: c.Min(d => d.Price), maximum: c.Max(d => d.Price)));

এবং জাভা, সি # বা অনুরূপ ভাষাগুলিতে পর্যাপ্ত অভিজ্ঞতা সহ যে কোনও ব্যক্তির দ্বারা পঠনযোগ্য বলে বিবেচিত হবে।

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

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

তুলনা করা:

public void IsWithinRanges<T>(T number, param Range<T>[] ranges) where T : INumeric
{
    foreach (var range in ranges)
    {
        if (number >= range.Left && number <= range.Right)
        {
            return true;
        }
    }

    return false;
}

প্রতি:

public function void IsWithinRanges
    with parameters T number, param array of (Range of T) ranges
    using generic type T
    given that T implements INumeric
{
    for each (var range in ranges)
    {
        if (number is from range.Left to range.Right)
        {
            return true;
        }
    }

    return false;
}

একই পথে:

var a = ((b - c) in 1..n) ? d : 0;

একটি কাল্পনিক ভাষায় প্রকাশ করা যেতে পারে:

define variable a being equal to d if (b minus c) is between 1 and n or 0 otherwise;

খাটো সিনট্যাক্স কখন ভাল হয়?

প্রাথমিকের জন্য আরও ভার্বোজ সিনট্যাক্স বোঝা সহজ হলেও অভিজ্ঞ বিকাশকারীদের জন্য আরও কমপ্যাক্ট সিনট্যাক্স সহজ। সংক্ষিপ্ত কোড মানে টাইপ করার জন্য কম অক্ষর, যার অর্থ বেশি উত্পাদনশীলতা।

বিশেষত, সিনট্যাক্স থেকে কেটে নেওয়া যেতে পারে এমন কোনও কিছু নির্দেশ করার জন্য কোনও ব্যক্তিকে কীওয়ার্ড টাইপ করার জন্য জোর করা উচিত তা সত্য নয়।

উদাহরণ:

  • পিএইচপি-তে আপনাকে functionপ্রতিটি ক্রিয়া বা পদ্ধতির আগে টাইপ করতে হবে, এটি করার কোনও নির্দিষ্ট কারণ নেই।

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

  • সিনট্যাক্স 1..nঅনেক FP (এবং মতলব) ব্যবহৃত দ্বারা প্রতিস্থাপিত করা যেতে পারে between 1, nবা between 1 and nবা between (1, n)। কী- betweenওয়ার্ডটি ভাষাগত বাক্য গঠনের সাথে পরিচিত নয় এমন লোকদের পক্ষে এটি বোঝার পক্ষে আরও সহজ করে তোলে, তবে এখনও, দুটি বিন্দু টাইপ করতে খুব দ্রুত are


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

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

@ জিমি হোফা: দেখুন প্রোগ্রামারস.স্ট্যাকেক্সেঞ্জাংটা / আ/158721/6605 যেখানে আমি ঠিক সি # স্নিপেট নিয়ে আলোচনা করি এবং এটি কীভাবে নতুন প্রোগ্রামাররা অনুধাবন করেন।
আর্সেনী মোরজেঙ্কো

1
@ সার্জি: জাভা বা সি # তে, কোনও পদ্ধতির স্বাক্ষরে এর methodকীওয়ার্ড নেই । উদাহরণ: public int ComputePrice(Product product)। পিএইচপি যা করেছে তার মতো এ জাতীয় কীওয়ার্ড যুক্ত করা সহজ জিনিসগুলি পড়া সহজ করার পরিবর্তে বিশৃঙ্খলা যুক্ত করে। যদি কোনও প্রোগ্রামার বুঝতে সক্ষম না হন যে কোনও ফাংশন তার স্বাক্ষর থেকে ফাংশন, তবে এই প্রোগ্রামারটির কোনও অভিজ্ঞতা নেই, বা কোডটি আমার দেখা সবচেয়ে খারাপ পিস কোডের চেয়ে অনেক বেশি অপঠনযোগ্য।
আর্সেনী মোরজেঙ্কো

1
@ সার্জি: এমন কিছু ঘটনা রয়েছে যেখানে ভার্বোসিটি সাহায্য করতে পারে (অন্যথায়, আমরা ভাষা এবং কোড যেমন দেখতে পাব p i ComputePrice(product): _.unitPrice * ~.cart[_]) তবে কিছু ভাষা একে একে অনেক দূরে ঠেলে দেয়। functionপিএইচপি-তে রিডানডেন্ট কীওয়ার্ডের উদাহরণ একটি ভাল উদাহরণ।
আর্সেনী মোরজেঙ্কো

6

আমি মনে করি এর অন্যতম কারণ হ'ল ফাংশনাল প্রোগ্রামিং অনেক বেশি বিমূর্ত ধারণা নিয়ে কাজ করে। এটি ধারণাগুলি জানে এবং বোঝে এমন লোকদের জন্য কোডটি সংক্ষিপ্ত এবং আরও পঠনযোগ্য করে তোলে (কারণ তারা যথাযথভাবে সমস্যার সারমর্মটি প্রকাশ করে) তবে তাদের সাথে যারা পরিচিত না তাদের পক্ষে এটি অপঠনযোগ্য।

উদাহরণস্বরূপ, একটি ক্রিয়ামূলক প্রোগ্রামারটির জন্য এমন একটি কোড লেখা স্বাভাবিক যে Maybeমোনাদ বা Eitherমোনাডের মধ্যে বিভিন্ন পয়েন্টে ব্যর্থ হতে পারে । অথবা, মোনাদের সাহায্যে একটি রাষ্ট্রীয় গণনা লিখতে হবে State। তবে যে কেউ মনাদের ধারণাটি বুঝতে পারেন না, তাদের কাছে এটি একরকম কালো যাদু বলে মনে হচ্ছে।

সুতরাং আমি মনে করি যে এমনকি ওওপি লোকের একটি দলে ফাংশনাল প্রোগ্রামিংয়ের বিটগুলি ব্যবহার করা যুক্তিসঙ্গত হবে যতক্ষণ না কোনও ধারণা বা ফাংশন বা ক্লোজারগুলির সাথে সংগ্রহের মাধ্যমে ম্যাপিংয়ের মতো বোঝার বা শেখার সহজ ধারণা ব্যবহার করা হয় ।

(এবং অবশ্যই এটি প্রোগ্রামার যিনি কিছু কিছু কোড লিখেছিলেন তার উপরও নির্ভর করে You আপনি যে কোনও ভাষায় ভয়াবহভাবে অপঠনযোগ্য কোড লিখতে পারেন, পাশাপাশি আপনি একটি সুন্দর এবং পরিষ্কার স্টাইলে লিখতে পারেন))


2

প্যারাডাইম, মডেল এবং এর সাথে পাঠযোগ্যতার কোনও সম্পর্ক নেই। যত বেশি কোড আপনার সমস্যা ডোমেনের শব্দার্থ প্রতিবিম্বিত করে, ততই এটি কোনও সমস্যা ডোমেনের পরিভাষা এবং আইডিয়ামগুলি পরিচালনা করে, তত বেশি পাঠযোগ্য।

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

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


1

কোড পাঠযোগ্যতা বিষয়গত j আমি নিশ্চিত যে কিছু লোক বোঝার অভাবের দ্বারা এটির সমালোচনা করে। সাধারণ নিদর্শনগুলি যেভাবে প্রয়োগ করা হয় তাতে প্রাকৃতিকভাবে বিভিন্ন আইডিয়াম রয়েছে। উদাহরণস্বরূপ, প্যাটার্ন ম্যাচিংয়ের সাথে দর্শনার্থীর প্যাটার্নটি সত্যিকার অর্থে কোনও অর্থবোধ করে না

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

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

কার্যকরী ভাষাগুলিতে বাণিজ্যিক বিকাশ এখনও অপেক্ষাকৃত অপরিণত। আমি বেশ কয়েকটি ভুল দেখেছি যা কোনও ভাষায় খারাপ ফর্ম হিসাবে বিবেচিত হবে। যেমন:

  1. ভাষাটি শিখার সাথে সাথে পরিবর্তন করার শৈলী (এবং রিফ্যাক্টরিং নয়) অসংলগ্নতার দিকে পরিচালিত করে।
  2. একটি ফাইলে খুব বেশি।
  3. এক লাইনে অনেকগুলি বক্তব্য।

ভুল সম্পর্কিত আমিও যুক্ত করব: ৪. প্রতীকগুলির অতিরিক্ত ব্যবহার, যেমন: ~ @ # $% ^ & * () -_ + = \ | /।,; ৫. অন্তর্নিহিত বৈশিষ্ট্য: alচ্ছিক ঘোষণা / কীওয়ার্ড / বিবৃতি, অন্তর্ভুক্ত রূপান্তর ইত্যাদি;
সের্গেই সোকোলেঙ্কো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.