C ++ হিসাবে কি জাভা শ্রেণি সংজ্ঞা এবং বাস্তবায়নের মধ্যে পৃথকীকরণের প্রচার করে?


10

আমার একটি হোমওয়ার্ক অ্যাসাইনমেন্ট রয়েছে এবং জিআরএসপি "সুরক্ষিত ভেরিয়েশন" অনুসারে কোন পদ্ধতিটি ভাল তা আমার মূল্যায়ন করতে হবে। আমি সি ++ এ শিরোনাম এবং কোড ফাইলগুলির বিভাজন সম্পর্কে স্ট্যাক ওভারফ্লোতে একটি প্রশ্ন পেয়েছি ।

যাইহোক, আমি যা জানতে চাই যে কেন জাভা শ্রেণিক সংজ্ঞা এবং শ্রেণি প্রয়োগের মধ্যে বিচ্ছিন্নতা প্রচারে সি ++ অনুসরণ করে না। জাভা পদ্ধতিতে সি ++ পদ্ধতিতে কি কোনও সুবিধা রয়েছে?


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

ওফ, লিঙ্কটি কাজ করে না। আমি সংশোধন করব, আমি মূলত যা জানতে চেয়েছিলাম তা হ'ল উভয়ের মধ্যে পার্থক্য এবং যা কোডটি পুনরায় ব্যবহার করতে বা এক্সটেনসিবিলিটির জন্য একটির পক্ষে আরও সহজ হতে থাকে।
এটিয়েন নোল

1
সি তৈরির সময় সীমিত ওয়ান-পাস সংকলক প্রযুক্তির কারণে সি (এবং এক্সটেনশনের মাধ্যমে সি ++) এর বাস্তবায়ন ফাইলগুলি থেকে শিরোনাম ফাইলগুলি পৃথক করা ছাড়া কোন উপায় ছিল না।
চ্যানেল 72

2
জাভাতে ইন্টারফেস থাকতে পারে যা শ্রেণি সংজ্ঞা এবং শ্রেণি বাস্তবায়ন পৃথক করতে পারে, যদি প্রশ্নে শ্রেণি ইন্টারফেস প্রয়োগ করে। যদিও সি ++ এর মতো একরকম নয়।
হতাশ

1
এছাড়াও, সি ++ শিরোলেখ ফাইলগুলি আমার পছন্দের চেয়ে যথেষ্ট বেশি বাস্তবায়ন প্রকাশ করে, যদি না আপনি পিআইএমপিএল আইডিয়ামটি ব্যবহার করেন। এটি সমস্ত ডেটা সদস্যদের তালিকাভুক্ত করা প্রয়োজন, এমনকি যদি private, তাই বাস্তবায়নটি আকারটি জানতে privateপারে এবং সদস্যটিও কাজ করে।
ডেভিড থর্নলি

উত্তর:


13

নিম্নলিখিত প্রোগ্রামে কোডের কতটি লাইন রয়েছে?

#include <iostream>

int main()
{
   std::cout << "Hello, world!\n";
   return 0;
}

আপনি সম্ভবত 7 টি উত্তর দিয়েছেন (বা 6 আপনি যদি ফাঁকা লাইন গণনা করেন না, বা 4 আপনি যদি ধনুর্বন্ধনী গণনা করেন না)।

আপনার সংকলকটি অবশ্য খুব আলাদা কিছু দেখেছে:

~$ cpp hello.cpp | wc
  18736   40822  437015

হ্যাঁ, এটি কেবলমাত্র একটি "হ্যালো, বিশ্ব!" কার্যক্রম. সি ++ সংকলককে সমস্ত কিছু পার্স করতে হবে। এটি অন্যান্য কারণগুলির তুলনায় সি ++ সংকলনটি এত বেশি সময় নেয় কেন এবং আধুনিক ভাষা কেন শিরোনাম ফাইলগুলি বন্ধ করে দেয় এটি একটি প্রধান কারণ ।

আরও ভাল প্রশ্ন হবে

কেন নেই C ++ হেডার ফাইল আছে?

সি ++ সি এর সুপারসেট হিসাবে ডিজাইন করা হয়েছিল, সুতরাং এটি পিছনের সামঞ্জস্যের জন্য হেডার ফাইলগুলি রাখতে হয়েছিল।

ঠিক আছে, তাহলে সি এর কেন হেডার ফাইল আছে?

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

~$ cat sqrtdemo.c 
int main(void)
{
    /* implicit declaration int sqrt(int) */
    double sqrt2 = sqrt(2);
    printf("%f\n", sqrt2);
    return 0;
}

~$ gcc -Wall -ansi -lm -Dsqrt= sqrtdemo.c
sqrtdemo.c: In function main’:
sqrtdemo.c:5:5: warning: implicit declaration of function printf [-Wimplicit-function-declaration]
sqrtdemo.c:5:5: warning: incompatible implicit declaration of built-in function printf [enabled by default]
~$ ./a.out 
2.000000

যথাযথ প্রকারের ঘোষণাগুলি যুক্ত করা বাগটি সংশোধন করে:

~$ cat sqrtdemo.c 
#undef printf
#undef sqrt

int printf(const char*, ...);
double sqrt(double);

int main(void)
{
    double sqrt2 = sqrt(2);
    printf("%f\n", sqrt2);
    return 0;
}

~$ gcc -Wall -ansi -lm sqrtdemo.c
~$ ./a.out 
1.414214

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

আধুনিক ভাষা কীভাবে হেডার ফাইলগুলি এড়াতে সক্ষম?

টাইপ তথ্য অন্তর্ভুক্ত একটি ভিন্ন অবজেক্ট ফাইল ফর্ম্যাট ব্যবহার করে। উদাহরণস্বরূপ, জাভা * .ক্লাস ফাইল ফর্ম্যাটে "বর্ণনাকারী" রয়েছে যা ক্ষেত্র এবং পদ্ধতির পরামিতিগুলির ধরণ নির্দিষ্ট করে।

এটি কোনও নতুন আবিষ্কার ছিল না। এর আগে (1987), যখন বোরল্যান্ড টার্বো পাস্কেল ৪.০-এ আলাদাভাবে সংকলিত "ইউনিট" যুক্ত করেছিল, তখন শিরোনামের ফাইলগুলির প্রয়োজনীয়তা অপসারণ করার জন্য *.TPUটার্বো সি-র পরিবর্তে একটি নতুন বিন্যাস ব্যবহার করা বেছে নিয়েছিল *.OBJ


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

7

একটি চুক্তি সংজ্ঞায়িত করার জন্য জাভাটির ইন্টারফেস রয়েছে। এটি কলারের কী প্রয়োজন এবং প্রকৃত বাস্তবায়ন থেকে উচ্চতর স্তরের বিমূর্ততা দেয়। অর্থাত কলকারীকে বাস্তবায়নকারী ক্লাসটি জানার দরকার নেই, এটি কেবল যে চুক্তিটি সমর্থন করে তা জানতে হবে।

বলুন আপনি এমন একটি পদ্ধতি লিখতে চান যা মানচিত্রে সমস্ত কী / মানকে ধীর করে দেয়।

public static <K,V> void printMap(Map<K,V> map) {
    for(Entry<K,V> entry: map.entrySet())
        System.out.println(entry);
}

এই পদ্ধতিটি একটি বিমূর্ত ইন্টারফেসে এন্ট্রিসেট () কল করতে পারে যা এটি প্রয়োগকারী শ্রেণী থেকে সরানো হয়। আপনি এই পদ্ধতিতে কল করতে পারেন।

printMap(new TreeMap());
printMap(new LinkedHashMap());
printMap(new ConcurrentHashMap());
printMap(new ConcurrentSkipListMap());

1
সেখানে প্রোগ্রামারদের স্বাগতম পিটার - ভেবেছি আমি নামটি :-) স্বীকৃত করেছি। আমি যুক্ত করব যে কিছু লোক যুক্তিযুক্ত হবে যে জাভাতে অ্যাবস্ট্রাক্ট বেস ক্লাসগুলিও একটি চুক্তি সংজ্ঞায়িত করেছে - তবে এটি সম্ভবত পৃথক থ্রেডের পক্ষে একটি যুক্তি।
মার্টিজ ভার্বার্গ

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

হ্যাঁ জাভা পাবলিক কন্ট্রাক্টকে সংজ্ঞায়িত করার একাধিক উপায় থাকার
স্ক্যালাল পথ অবধি শুরু করতে চলেছে

-1 এটি সিম্পল সহ সি ++ তেও সম্ভব #define interface class
সোজর্ড

@ সোজারড আমি জানতাম না সি ++ পদ্ধতিগুলির বহিরাগততা virtualপেতে কীওয়ার্ডটি ব্যবহার করার দরকার নেই এবং আপনি জাভাতে যেমন এক বা দুটি কংক্রিট প্রকারের ব্যবহার করেন তবে এটির কার্য সম্পাদনের পেনাল্টি নেই। আপনি কী আমাকে কোনও ডকুমেন্টেশনের দিকে ইঙ্গিত করতে পারেন এটি সি ++ এ কীভাবে কাজ করে?
পিটার লরে

5

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


3

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

আপনি সমস্ত বাস্তবায়নকে একটি সি ++ শিরোনামে অন্তর্ভুক্ত করতে পারেন তবে লিঙ্কারকে নকল অনুলিপিগুলি বাছাই করতে এবং ফেলে দেওয়ার জন্য বাধ্য করে এটি প্রতিবার # অন্তর্ভুক্ত করার সাথে সংকলকটি এটি পুনরায় সঙ্কলিত করে।


0

জাভা শ্রেণি সংজ্ঞা এবং বাস্তবায়নের বিভাজনকে উত্সাহ দেয় না, এটি আপনি কোথায় থেকে দেখছেন তা কেবল নির্ভর করে।

আপনি যখন জাভা ক্লাসের লেখক হন তখন ক্লাসের সংজ্ঞা এবং তার প্রয়োগটি একটি ফাইলে দেখতে পাবেন। এটি বিকাশ প্রক্রিয়াটিকে সহজতর করে তোলে কারণ আপনি ক্লাস বজায় রাখতে কেবল এক জায়গায় যেতে পেরেছেন, আপনাকে দুটি ফাইলের মধ্যে পরিবর্তন করতে হবে না (। এইচ এবং .cpp যেমন আপনি সি ++ তে যাবেন)। যাইহোক, আপনি যখন ক্লাসের গ্রাহক হন তখন কেবলমাত্র একটি .class ফাইলের মাধ্যমে যা জাজারে অথবা স্ট্যান্ড্যালোন। ক্লাসে প্যাকেজযুক্ত একটি ক্লাস ফাইলের মাধ্যমে সংজ্ঞাটি নিয়ে কাজ করেন

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

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