ঘোষিত এবং আবশ্যক প্রোগ্রামিং মধ্যে পার্থক্য কি? [বন্ধ]


541

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


3
অনুজ্ঞাসূচক একটি রেস্টুরেন্ট এবং আদেশ একটি 6oz চলে যায়। স্টেক (বিরল রান্না করা), ফ্রাই (কেচাপ সহ), সাইড-সালাদ (রাঞ্চযুক্ত) এবং একটি কোক (কোনও বরফ নেই) ওয়েটার তার কাছে যা চেয়েছিল ঠিক তা প্রদান করে এবং তার থেকে। 14.50 নেওয়া হয়েছে। অন্যদিকে, ডিক্লারেটিভ একটি রেস্তোঁরায় যান এবং ওয়েটারকে বলে যে তিনি কেবল রাতের খাবারের জন্য প্রায় 12 ডলার দিতে চান এবং তিনি স্টেকের মুডে রয়েছেন। ওয়েটার একটি 6 জনের সাথে ফিরে আসে। স্টেক (রান্না করা মাঝারি), ছড়িয়ে দেওয়া আলু, স্টিমযুক্ত ব্রকলি, একটি ডিনার রোল এবং এক গ্লাস জল side তার কাছ থেকে $ 11.99 নেওয়া হয়েছে।
cs_pupil

উত্তর:


786

ঘোষণামূলক বনাম অপরিহার্য প্রোগ্রামিংয়ের একটি দুর্দান্ত সি # উদাহরণ লিনকুই Q

সঙ্গে অনুজ্ঞাসূচক প্রোগ্রামিং, আপনি কম্পাইলার কি ঘটতে, ধাপে ধাপে চান বলুন।

উদাহরণস্বরূপ, আসুন এই সংগ্রহটি দিয়ে শুরু করা যাক এবং বিজোড় সংখ্যাগুলি বেছে নিন:

List<int> collection = new List<int> { 1, 2, 3, 4, 5 };

অত্যাবশ্যক প্রোগ্রামিং সহ, আমরা এটির মাধ্যমে পদক্ষেপ নেব এবং আমরা কী চাই তা স্থির করব:

List<int> results = new List<int>();
foreach(var num in collection)
{
    if (num % 2 != 0)
          results.Add(num);
}

এখানে, আমরা বলছি:

  1. ফলাফল সংগ্রহ তৈরি করুন
  2. সংগ্রহে প্রতিটি নম্বর দিয়ে পদক্ষেপ
  3. নম্বরটি পরীক্ষা করে দেখুন, যদি এটি বিজোড় হয় তবে ফলাফলগুলিতে এটি যুক্ত করুন

অন্যদিকে ঘোষিত প্রোগ্রামিং সহ , আপনি এমন কোড লিখেছেন যা আপনি কী চান তা বর্ণনা করে তবে কীভাবে এটি পাবেন তা নয় (আপনার পছন্দসই ফলাফলগুলি ঘোষণা করুন, তবে ধাপে ধাপে নয়):

var results = collection.Where( num => num % 2 != 0);

এখানে, আমরা "সংগ্রহের ধাপে ধাপে নয়, বরং আমাদের যেখানে যা কিছু রয়েছে তা সবই দিয়ে দিন" বলছি this

অনেক ক্ষেত্রে কোড দুটি ডিজাইনের মিশ্রণও হয়ে থাকে, তাই এটি সবসময় কালো-সাদা হয় না।


8
+1 টি। যাইহোক, আপনি প্রথমে লিনকিউ উল্লেখ করেছেন, তবে এর সাথে উদাহরণগুলির কী আছে?
জ্যানো

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

241
এটি আমার কাছে মনে হয় যে ঘোষণামূলক প্রোগ্রামিং বিমূর্ততার স্তর ছাড়া আর কিছুই নয়।
ড্রাজেন বিজেলভুক

8
এটি একটি ভাল উত্তর, তবে এটি অপরিষ্কার কার্যকরী এবং অপরিহার্য প্রোগ্রামিংয়ের মধ্যে পার্থক্যটির উত্তর দিচ্ছে। লিনাক সরবরাহীয়collection.Where ঘোষণামূলক সিনট্যাক্স ব্যবহার করছে না - উদাহরণগুলির জন্য এমএসডিএন.ইমক্রোসফটকম /en-us/library/bb397906.aspx দেখুন , from item in collection where item%2 != 0 select itemঘোষণামূলক ফর্ম হবে। কোনও ফাংশন কল করা ঘোষিত প্রোগ্রামিং হয়ে ওঠে না কারণ এই ফাংশনটি সিস্টেম। লিংক নেমস্পেসে রয়েছে।
পিট কির্খাম

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

145

ঘোষণামূলক প্রোগ্রামিং হয় যখন আপনি বলে কি আপনি চান, এবং অনুজ্ঞাসূচক ভাষা যখন আপনি বলে কিভাবে আপনি যা চান তা পেতে।

পাইথনের একটি সাধারণ উদাহরণ:

# Declarative
small_nums = [x for x in range(20) if x < 5]

# Imperative
small_nums = []
for i in range(20):
    if i < 5:
        small_nums.append(i)

প্রথম উদাহরণটি ঘোষিত কারণ আমরা তালিকাটি নির্মাণের কোনও "প্রয়োগের বিশদ" নির্দিষ্ট করি না।

একটি সি # উদাহরণে টাই করার জন্য, সাধারণত লিনিক্যু ব্যবহারের ফলে একটি ঘোষণামূলক স্টাইলে ফলাফল আসে কারণ আপনি যা চান তা কীভাবে অর্জন করবেন তা আপনি বলছেন না; আপনি কেবল যা চান তা বলছেন । আপনি এসকিউএল সম্পর্কে একই বলতে পারে।

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

SELECT score FROM games WHERE id < 100;

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


30
পাইথনের উদাহরণটি ঘোষণামূলক নয়।
জুয়ানজো কন্টি

18
@Juanjo: এটা IS decalarative।
অনুপস্থিতি

3
এখানে দ্বিতীয় বিবৃতিটি কীভাবে দ্বিতীয়টির চেয়ে বেশি ঘোষিত?
zenna

17
জুয়ানজো এবং জেনার সাথে সম্মত - একটি লুপ কন্সট্রাক্ট একটি সংক্ষিপ্ত স্বরলিপিতে রিফ্যাক্ট হয়ে গেলে যাদুবিদ্যামূলকভাবে ঘোষিত প্রোগ্রামে রূপান্তরিত হয় না।
ফেলিক্স ফ্র্যাঙ্ক

11
@ ফেলিক্স ফ্র্যাঙ্কের সাথে একমত নন এবং @ অনুপস্থিত ফ্যাক্টরের "সাহসী" বক্তব্যের দিকে ঝুঁকছেন। এটি করার Theতিহ্যবাহী, "সম্পূর্ণরূপে" ঘোষণামূলক উপায় filter(lambda x: x < 5, range(20))হ'ল একটি সংক্ষিপ্ত স্বরলিপি হিসাবে অন্য একটি রিফ্যাক্টরিং। এটি তালিকা বোধগম্য অভিব্যক্তি (যা পরিষ্কার "মানচিত্র" এবং "ফিল্টার" বিভাগ রয়েছে) থেকে কোনও অর্থবহ উপায়ে পৃথক নয়, যা আরও সংক্ষিপ্ত স্বরলিপি তৈরির সুস্পষ্ট অভিপ্রায় সহ তৈরি হয়েছিল ( পিপ 202 দেখুন )। এবং এই তালিকাটি বোঝার ক্ষেত্রে এই ক্ষেত্রে আরও স্পষ্ট / ইডিয়োমেটিক হবে।
yoniLavi

100

ঘোষণাপত্র বনাম আবশ্যক

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

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

ইমপিটেটিভ প্রোগ্রামিং : একটি প্রোগ্রামিং দৃষ্টান্ত যা একটি প্রোগ্রামের অবস্থার পরিবর্তন করে এমন স্টেটমেন্টের ক্ষেত্রে গণনার বর্ণনা দেয়। ঘোষিত কর্মসূচিগুলি প্রোগ্রামিং কমান্ড বা গাণিতিক বক্তব্য হিসাবে দ্বিগুণ দেখা যায়।

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

এমএসডিএন-তে জরুরী প্রোগ্রামিংয়ের নিম্নলিখিত উদাহরণটি 1 থেকে 10 এর মধ্যে লুপ করে এবং সমান সংখ্যাগুলি খুঁজে বের করে।

var numbersOneThroughTen = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//With imperative programming, we'd step through this, and decide what we want:
var evenNumbers = new List<int>();
foreach (var number in numbersOneThroughTen)
{    if (number % 2 == 0)
    {
        evenNumbers.Add(number);
    }
}
//The following code uses declarative programming to accomplish the same thing.
// Here, we're saying "Give us everything where it's odd"
var evenNumbers = numbersOneThroughTen.Select(number => number % 2 == 0);

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


7
আপনি কি বস্তু-ভিত্তিকের জন্য একটি বিবরণ যুক্ত করতে পারেন?
এমবিগ্রাস


54

উপরের সমস্ত উত্তর এবং অন্যান্য অনলাইন পোস্টে নিম্নলিখিতটি উল্লেখ করা হয়েছে:

  • সঙ্গে ঘোষণামূলক প্রোগ্রামিং, আপনি বর্ণনা করে যে আপনি যা চান তা কিন্তু কোড লিখতে অগত্যা কিভাবে এটি পেতে
  • অত্যাবশ্যক প্রোগ্রামিংয়ের চেয়ে আপনার ঘোষিত প্রোগ্রামিং পছন্দ করা উচিত

তারা আমাদের যা বলেন নি তা হল এটি কীভাবে অর্জন করা যায় । প্রোগ্রামটির অংশটি আরও ঘোষিত হওয়ার জন্য, অন্যান্য অংশগুলি অবশ্যই প্রয়োগের বিবরণগুলি (যা প্রয়োজনীয় কোডগুলি) আড়াল করতে বিমূর্ততা সরবরাহ করতে হবে ।

  • উদাহরণস্বরূপ, লিনকিউ হ'ল লুপগুলির চেয়ে বেশি ঘোষিত (যেমন, যখন, ইত্যাদি), উদাহরণস্বরূপ, আপনি list.Where()একটি নতুন ফিল্টারযুক্ত তালিকা পেতে ব্যবহার করতে পারেন । এটি কাজ করার জন্য, মাইক্রোসফ্ট লিনকিউ বিমূর্তনের পিছনে সমস্ত ভারী উত্তোলন করেছে।

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

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

পরিশেষে, যদিও ক্রিয়ামূলক প্রোগ্রামিং এবং লিনকুই আপনার প্রোগ্রামটিকে আরও ঘোষণামূলক করে তুলতে পারে, আপনি আরও বিমূর্ততা সরবরাহ করে সর্বদা এটি আরও ঘোষিত করতে পারেন। উদাহরণ স্বরূপ:

// JavaScript example

// Least declarative
const bestProducts = [];
for(let i = 0; i < products.length; i++) {
    let product = products[i];
    if (product.rating >= 5 && product.price < 100) {
        bestProducts.push(product);
    }
}


// More declarative
const bestProducts = products.filter(function(product) {
    return product.rating >= 5 && product.price < 100;
});

// Most declarative, implementation details are hidden in a function
const bestProducts = getBestProducts();

দ্রষ্টব্য ঘোষণামূলক প্রোগ্রামিং চরম নতুন ডোমেইন নির্দিষ্ট ভাষা (ডিএসএল) উদ্ভাবিত করা:

  1. স্ট্রিং অনুসন্ধান : কাস্টম আবশ্যক কোডের পরিবর্তে নিয়মিত এক্সপ্রেশন
  2. প্রতিক্রিয়া.জেএস : সরাসরি ডিওএম ম্যানিপুলেশনের পরিবর্তে জেএসএক্স
  3. এডাব্লুএস ক্লাউডফর্মেশন : সি এল এলির পরিবর্তে ওয়াইএএমএল
  4. রিলেশনাল ডেটাবেস : ইসম বা ভিএসএএম এর মতো পুরানো পড়া-লেখার API গুলি পরিবর্তে এসকিউএল।

সেখানে ঘোষণামূলক programmings অনেক ভাল উদাহরণ দেওয়া হল: প্রতিক্রিয়া , CloudFormation , Terraform
engineforce

সুতরাং "ঘোষিত" প্রোগ্রামিং মানে কেবল কোডটি সরিয়ে দেওয়া যা কাজ করে একটি কাজ করে?
গিলিয়াম এফ।

@GuillaumeF। এটি ডোমেন নির্দিষ্ট বিমূর্ততা তৈরি সম্পর্কে। যেমন, - ব্যাংকিং: আপনি যেমন ফাংশন তৈরি করা উচিত debit, depositইত্যাদি পরিবর্তে পুনরায় imparative কোডেরaccount.balance += depositAmount
engineforce

44

আমি অন্য একটি উদাহরণ যুক্ত করব যা খুব কমই ঘোষিত / আবশ্যক প্রোগ্রামিং আলোচনায় পপ আপ হয়: ইউজার ইন্টারফেস!

সি # তে, আপনি বিভিন্ন প্রযুক্তি ব্যবহার করে একটি ইউআই তৈরি করতে পারেন।

অপরিহার্য প্রান্তে, আপনি খুব জরুরীভাবে আপনার বোতামগুলি, চেকবক্সগুলি ইত্যাদি আঁকার জন্য ডাইরেক্টএক্স বা ওপেনজিএল ব্যবহার করতে পারেন ... লাইন বাই লাইন (বা সত্যই, ত্রিভুজ দ্বারা ত্রিভুজ)। ব্যবহারকারী ইন্টারফেসটি কীভাবে আঁকতে হবে তা বলার অপেক্ষা রাখে না।

ঘোষিত শেষে, আপনার ডাব্লুপিএফ আছে have আপনি মূলত কিছু এক্সএমএল (হ্যাঁ, হ্যাঁ, "এক্সএএমএল" প্রযুক্তিগতভাবে) লিখুন এবং ফ্রেমওয়ার্কটি আপনার পক্ষে কাজ করে। আপনি বলেছেন যে ব্যবহারকারী ইন্টারফেসটি দেখতে কেমন লাগে। এটি কীভাবে করবেন তা সিস্টেমের উপর নির্ভর করে up

যাইহোক, চিন্তা করার জন্য অন্য একটি জিনিস। কেবল একটি ভাষা ঘোষিত বা আবশ্যকীয়র অর্থ এই নয় যে এর অন্যটির নির্দিষ্ট বৈশিষ্ট্য নেই।

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

এটির সমস্ত বক্তব্য:

ঘোষিত -> whatআপনি করতে চান

জরুরি -> howআপনি এটি করতে চান


27

আমি একটি ক্যামব্রিজ কোর্স থেকে তাদের ব্যাখ্যা পছন্দ করেছি + তাদের উদাহরণ:

  • ঘোষণামূলক - কী করতে হবে তা নির্দিষ্ট করুন, কীভাবে এটি করবেন না
    • উদাহরণস্বরূপ: এইচটিএমএল কোনও ওয়েব পৃষ্ঠায় কী প্রদর্শিত হবে তা বর্ণনা করে, কীভাবে এটি স্ক্রিনে আঁকা উচিত
  • আবশ্যক - কী এবং কীভাবে উভয়ই নির্দিষ্ট করুন
    • int x; - কি (ঘোষক)
    • x=x+1; - কিভাবে

"না কিভাবে এটা পর্দায় আকৃষ্ট করা উচিত" ... সুতরাং যে পরোক্ষভাবে যে CSSহয় অনুজ্ঞাসূচক তারপর?
শেফ_কোড

11
না It এটি ঘোষণাীয় হিসাবেও বিবেচিত হতে পারে কারণ আপনি যা চান তা কেবল বলেন - "এই ঘরের সীমানাকে নীল করুন" । কল্পনা করুন যে আপনি একই আবশ্যক পদ্ধতির (যেমন: জাভাস্ক্রিপ্ট) একই সীমানা আঁকতে চান। তারপরে আপনাকে "বিন্দুতে যান (x1, y1) বলতে হবে, এই বিন্দু এবং (x2, y1) এর মধ্যে একটি নীল রেখা আঁকুন, (x2, y1) থেকে (x2, y2) নীল রেখা আঁকুন, একটি নীল রেখা আঁকুন (x2, y2) থেকে (x1, y2) থেকে (x1, y2) থেকে (x1, y1) নীল রেখা আঁকুন
রোমানিয়া_আজ্ঞানী

@ রোমানিয়া_জিনিজার, দয়া করে কোথায় আমি এই জাতীয় ক্যামব্রিজ কোর্সটি পেতে পারি?
টেস্ট দল

@teteam, গুগলে নিম্নলিখিত "cl.cam.ac.uk শিক্ষণ ooprog" অনুসন্ধান করুন। আপনি ইউআরএল থেকে বছর পরিবর্তন করতে পারেন।
রোমানিয়া_আজ্ঞানী

@ রোমানিয়া_আজ্ঞানী, এটি পেয়েছে, ধন্যবাদ
পরীক্ষার দল

26

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


আপনি প্রতিটি নির্দেশের টুকরোটির দিকে কোনও ধারাবাহিকতায় কোথাও পড়তে পারেন:

বিমূর্তনের ডিগ্রি:

Declarative <<=====|==================>> Imperative

ঘোষিত রিয়েল ওয়ার্ল্ড উদাহরণ:

  1. গ্রন্থাগারিক, দয়া করে আমাকে মবি ডিকের একটি অনুলিপি দেখুন। (গ্রন্থাগারিক, তাদের বিবেচনার ভিত্তিতে অনুরোধ সম্পাদন করার জন্য সেরা পদ্ধতি চয়ন করে)

অতীব বাস্তব বাস্তব উদাহরণ:

  1. লাইব্রেরিতে যান
  2. বুক অর্গানাইজেশন সিস্টেম সন্ধান করুন (কার্ড ক্যাটালগ - পুরাতন স্কুল)
  3. কীভাবে কার্ড ক্যাটালগগুলি ব্যবহার করবেন তা গবেষণা করুন (আপনিও ভুলে গেছেন, ডান)
  4. তাকগুলি কীভাবে লেবেলযুক্ত এবং সংগঠিত হয় তা নির্ধারণ করুন।
  5. কীভাবে বইয়ের বইয়ের ব্যবস্থা করা হয়েছে তা চিত্রিত করুন।
  6. সংস্থাটির সিস্টেমের সাথে কার্ড ক্যাটালগ থেকে ক্রস-রেফারেন্স বইয়ের অবস্থানটি খুঁজে পাওয়া বইটি সন্ধান করুন।
  7. চেক-আউট সিস্টেমে বই নিন।
  8. বইটি দেখুন।

এটি কি ঘোষণামূলক / আবশ্যকীয়তার চেয়ে বিমূর্তনের বিষয়ে বেশি নয়? আপনি এখনও গ্রন্থাগারিককে বইটি আনতে নির্দেশ দিচ্ছেন।
কামাথলন

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

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

24

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

আবশ্যক শৈলীর চেয়ে ঘোষণামূলক শৈলীর দুটি সুবিধা রয়েছে:

  • এটি ভ্রমণকারীকে নির্দেশের একটি দীর্ঘ সেট মুখস্থ করতে বাধ্য করে না।
  • এটি ট্র্যাভেলারটিকে যখন সম্ভব হবে তখন রুটটিকে অনুকূল করে তুলবে।

কালভার্ট, সি কুলকার্নি, ডি (২০০৯)। প্রয়োজনীয় লিনকুই। অ্যাডিসন ওয়েসলি 48।


11

জরুরী প্রোগ্রামিং কম্পিউটারকে স্পষ্ট করে বলছে যে কী করা উচিত এবং কীভাবে এটি করা উচিত, যেমন অর্ডার নির্দিষ্টকরণ এবং এর মতো

সি #:

for (int i = 0; i < 10; i++)
{
    System.Console.WriteLine("Hello World!");
}

আপনি যখন কম্পিউটারকে কী করবেন তা বলার ক্ষেত্রে ঘোষণাটি হ'ল তবে কীভাবে এটি করবেন তা নয়। এই ক্ষেত্রে ডেটাএলগ / প্রোলোল হ'ল প্রথম ভাষা। মূলত সবকিছুই ঘোষণামূলক। আপনি সত্যই অর্ডার গ্যারান্টি দিতে পারবেন না।

সি # হ'ল অনেক বেশি প্রয়োজনীয় প্রোগ্রামিং ভাষা, তবে নির্দিষ্ট সি # বৈশিষ্ট্যগুলি লিনকের মতো আরও ঘোষণামূলক

dynamic foo = from c in someCollection
           let x = someValue * 2
           where c.SomeProperty < x
           select new {c.SomeProperty, c.OtherProperty};

একই জিনিস জরুরীভাবে লেখা যেতে পারে:

dynamic foo = SomeCollection.Where
     (
          c => c.SomeProperty < (SomeValue * 2)
     )
     .Select
     (
          c => new {c.SomeProperty, c.OtherProperty}
     )

(উইকিপিডিয়া লিনকের উদাহরণ)


2
আপনি একটি টাইপো আছে: linq বিবৃতি, ঘোষণামূলক না imperitive (যদি ঘোষণামূলক পড়া উচিত "সি # টি বৈশিষ্ট্য, আরো অনুজ্ঞাসূচক Linq মত" আছে।
রিড Copsey

স্থির (কিছুক্ষণ আগে)
ম্যাককে

8

কম্পিউটার সায়েন্সে ডিক্যালিটিভ প্রোগ্রামিং হ'ল এমন একটি প্রোগ্রামিং দৃষ্টান্ত যা এর নিয়ন্ত্রণ প্রবাহকে বর্ণনা না দিয়ে কোনও গণনার যুক্তি প্রকাশ করে।

Http://en.wikedia.org/wiki/Declarative_programming থেকে

সংক্ষেপে ঘোষকীয় ভাষা সহজতর কারণ এতে নিয়ন্ত্রণ প্রবাহের জটিলতা নেই (লুপগুলি, বিবৃতিগুলি ইত্যাদি যদি)

একটি ভাল তুলনা হ'ল এএসপি.নেট 'কোড-ব্যাক' মডেল। আপনার কাছে ঘোষণামূলক '.এএসপিএক্স' ফাইল এবং তারপরে প্রয়োজনীয় 'এএসপিএক্স.সিএস' কোড ফাইল রয়েছে। আমি প্রায়শই দেখতে পাই যে আমি যদি স্ক্রিপ্টের ঘোষিত অর্ধে আমার প্রয়োজনীয় সমস্ত কাজ করতে পারি তবে অনেক বেশি লোকেরা যা করা হচ্ছে তা অনুসরণ করতে পারে।


7

ফিলিপ রবার্টস থেকে এখানে চুরি করা :

  • কার্যকর প্রোগ্রামিং মেশিনকে কীভাবে কিছু করতে হয় তার ফলাফল দেয় (যার ফলে আপনি কী হতে চান)
  • ডিক্লারেটিভ প্রোগ্রামিং মেশিনকে বলে যে আপনি কী হতে চান (এবং কম্পিউটার এটি কীভাবে করতে পারে তা নির্ধারণ করে)

দুটি উদাহরণ:

1. একটি অ্যারেতে সমস্ত সংখ্যা দ্বিগুণ করা

Imperatively:

var numbers = [1,2,3,4,5]
var doubled = []

for(var i = 0; i < numbers.length; i++) {
  var newNumber = numbers[i] * 2
  doubled.push(newNumber)
}
console.log(doubled) //=> [2,4,6,8,10]

Declaratively:

var numbers = [1,2,3,4,5]

var doubled = numbers.map(function(n) {
  return n * 2
})
console.log(doubled) //=> [2,4,6,8,10]

২. তালিকার সমস্ত আইটেম সংশ্লেষ করা

Imperatively

var numbers = [1,2,3,4,5]
var total = 0

for(var i = 0; i < numbers.length; i++) {
  total += numbers[i]
}
console.log(total) //=> 15

Declaratively

var numbers = [1,2,3,4,5]

var total = numbers.reduce(function(sum, n) {
  return sum + n
});
console.log(total) //=> 15

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


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

4

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

ঘোষিত প্রোগ্রামিং
একটি কম্পিউটার ভাষা যা languageতিহ্যবাহী প্রোগ্রামিং যুক্তি লেখার প্রয়োজন হয় না; ব্যবহারকারীরা পদ্ধতিগত প্রোগ্রামিং ভাষা যেমন সি ++ বা জাভাতে প্রয়োজনীয় প্রোগ্রামের পদক্ষেপগুলির চেয়ে ইনপুট এবং আউটপুট সংজ্ঞায়িত করতে মনোনিবেশ করেন।

ঘোষিত প্রোগ্রামিংয়ের উদাহরণ হ'ল সিএসএস, এইচটিএমএল, এক্সএমএল, এক্সএসএলটি, রেজিএক্স।


2

ঘোষিত প্রোগ্রামটি এর কিছু বেশি বা কম "সার্বজনীন" অপরিহার্য বাস্তবায়ন / ভিএম এর জন্য কেবলমাত্র একটি ডেটা।

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

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

পিএস ফ্রেমওয়ার্কগুলি ডিএসএল এবং অত্যাবশ্যকগুলির মধ্যে অর্ধপথ। এবং সমস্ত অর্ধেক সমাধান হিসাবে ... তারা ঘাটতিগুলি সম্মিলন করে, সুবিধা নয়। এগুলি এতটা নিরাপদ নয় এবং তত দ্রুত নয় :) জ্যাক-অফ-অল ট্রেডস হেস্কেলটি দেখুন - এটি শক্তিশালী সাধারণ এমএল এবং নমনীয় মেটাপ্রোগ প্রোলোগ এবং ... এটি কতটা দৈত্য way আপনি বুলিয়ান-কেবলমাত্র ফাংশন / পূর্বাভাসের সাথে হাসলকে হাসল হিসাবে প্রোলোগের দিকে দেখতে পারেন। এবং এর নমনীয়তা হাস্কেলের বিরুদ্ধে কত সহজ ...


2

আমি কেবল আশ্চর্য হই যে কেন কেউ সি # তে ঘোষিত প্রোগ্রামিং সরঞ্জাম হিসাবে অ্যাট্রিবিউট ক্লাসের কথা উল্লেখ করেনি। এই পৃষ্ঠার জনপ্রিয় উত্তরটি কেবল লিনিক্যু সম্পর্কে একটি ঘোষণামূলক প্রোগ্রামিং সরঞ্জাম হিসাবে কথা বলেছেন।

উইকিপিডিয়া অনুসারে

সাধারণ ঘোষিত ভাষাগুলিতে ডেটাবেস ক্যোয়ারী ভাষা (যেমন, এসকিউএল, এক্সকিউয়ারি), নিয়মিত এক্সপ্রেশন, লজিক প্রোগ্রামিং, ফাংশনাল প্রোগ্রামিং এবং কনফিগারেশন ম্যানেজমেন্ট সিস্টেম অন্তর্ভুক্ত থাকে।

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


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

2

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

এই বিল্ডারগুলি ব্যবহার করে আঁকা UI প্রকৃতিতে ঘোষিত, যেখানে আমরা উপাদানগুলি টেনে টেনে নামি। আসল অঙ্কনটি ফ্রেমওয়ার্ক এবং সিস্টেমের নীচে এবং সঞ্চালিত হয়।

তবে আমরা কোডগুলিতেও পুরো উপাদানগুলি আঁকতে পারি এবং এটি প্রকৃতির পক্ষে আবশ্যক।

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


জাভা কোনও সংক্ষিপ্ত বিবরণ নয় বিটিডব্লিউ
মর্ডচাই

1

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

public static void main(String[] args)
{
    System.out.print("4 = 4.");
}

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

private static Scanner input;    

public static void main(String[] args) 
{
    input = new Scanner(System.in);
    System.out.println();
    System.out.print("Enter an integer value for x: ");
    int x = input.nextInt();
    System.out.print("Enter an integer value for y: ");        
    int y = input.nextInt();

    System.out.println();
    System.out.printf("%d == %d? %s\n", x, y, x == y);
}

মূলত, ঘোষণামূলক জ্ঞান উপর ছেড়ে যাওয়া নির্দিষ্ট উপাদানের ঐ উপাদানের উপরে বিমূর্ততা একটি স্তর গঠন। ঘোষিত প্রোগ্রামিং একই কাজ করে does

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