জাভা সংস্কৃতি গ্রোকিং - জিনিস এত ভারী কেন? এটি কি জন্য অনুকূলিত করে? [বন্ধ]


288

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

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

আমি যে স্ট্যাক ওভারফ্লো প্রশ্নটি শুরু করেছি তাতে একটি সর্বনিম্ন সম্পূর্ণ উদাহরণ পাওয়া যায়: https://stackoverflow.com/questions/43619566/returning-a-result-with-several-values-the-java-way/43620339

আমার একটি কার্য আছে - পার্স (একক স্ট্রিং থেকে) এবং তিনটি মানের একটি সেট পরিচালনা করে। পাইথনে এটি একটি ওয়ান-লাইনার (টিপল), পাস্কাল বা সি-তে একটি 5-লাইনার রেকর্ড / স্ট্রাক্ট।

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

আমি বুঝতে পারি যে একটি বিশাল উন্নয়ন সম্প্রদায় সম্ভবত "ভুল" নয় not সুতরাং এটি আমার বুঝতে সমস্যা a

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


1
প্রশ্নের প্রযুক্তিগত দিকগুলি উত্তর দেবেন না তবে এখনও প্রসঙ্গে: সফ্টওয়্যারেনজেনারিং.স্ট্যাকেক্সেঞ্জার
163১63৫/১/৮৯8



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

1
জাভা ডি-ফ্যাক্টো স্ট্যান্ডার্ড হবার কারণ এটি কেবল সঠিক। এটি প্রথমবারের মতো গুরুতর লোকদের দ্বারা তৈরি করা হয়েছিল যাদের দাড়ির আগে দাড়ি ছিল ফ্যাশনেবল। আপনি যদি ফাইলগুলি ম্যানিপুলেট করতে শেল স্ক্রিপ্টগুলি কড়াতে অভ্যস্ত হন তবে জাভা অসহনীয়ভাবে ফুলে যায়। তবে আপনি যদি ক্লাস্টারযুক্ত রেডিস ক্যাচিং, 3 বিলিং সিস্টেম এবং একটি 20 এম পাউন্ড ওরাকল ডাটাবেস ক্লাস্টার দ্বারা সমর্থিত একটি দিনে দ্বিগুণ রিডানড্যান্ট সার্ভার ক্লাস্টার তৈরি করতে চান তবে অ্যাক্সেস করেও আপনি অজগর ব্যবহার করবেন না পাইথনে ডাটাবেসটি 25 লাইন কম কোড is
রিচার্ড

উত্তর:


237

জাভা ভাষা

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

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

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


জাভা সংস্কৃতি

এন্টারপ্রাইজ জাভা বিকাশের ইতিহাস আমাদেরকে আজ যে সংস্কৃতিতে দেখছে তাতে বহুলাংশে নেতৃত্ব দিয়েছে। 90 এর দশকের শেষে / 00 এর দশকের শুরুতে, জাভা সার্ভার-সাইড ব্যবসায়িক অ্যাপ্লিকেশনগুলির জন্য একটি অত্যন্ত জনপ্রিয় ভাষাতে পরিণত হয়েছিল। এরপরে সেই অ্যাপ্লিকেশনগুলি বেশিরভাগ ক্ষেত্রে অ্যাড-হক লেখা ছিল এবং এইচটিটিপি এপিআই, ডাটাবেস এবং এক্সএমএল ফিডগুলি প্রক্রিয়াকরণের মতো অনেক জটিল উদ্বেগকে একত্রিত করেছিল।

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

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

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


15
মজার বিষয় হ'ল অন্য ভাষাগুলি কিছু "জাভা-ইস্মস" তুলছে। পিএইচপি ওও বৈশিষ্ট্যগুলি জাভা দ্বারা প্রচুর পরিমাণে অনুপ্রাণিত হয় এবং আজকাল জাভাস্ক্রিপ্ট প্রায়শই এর বিশাল পরিমাণ ফ্রেমওয়ার্কের জন্য সমালোচনা করা হয় এবং সমস্ত নির্ভরতা সংগ্রহ করা এবং একটি নতুন অ্যাপ্লিকেশন শুরু করা কতটা কঠিন is
মার্কাস

14
@ মার্কাস সম্ভবত কারণ কিছু লোক "চাকা পুনরায় উদ্ভাবন করবেন না" জিনিস শিখেছে? নির্ভরতা
হ'ল চাকাটিকে সর্বোপরি

9
"টর্স" প্রায়শই আরকেনে অনুবাদ করে, "চতুর" , কোড-গল্ফ-ইশ ওয়ান-লাইনার।
তুলাইনস কর্ডোভা

7
চিন্তিত, উত্তম লিখিত উত্তর। ঐতিহাসিক প্রেক্ষাপট. তুলনামূলকভাবে অপরিবর্তিত। সুন্দরভাবে সম্পন্ন.
চিজমিস্টার

10
@ তুলাইনস কর্ডোভা আমি একমত যে আমাদের "প্লেগের মতো চতুর কৌশল" এড়ানো উচিত ... (ডোনাল্ড নুথ), তবে এর অর্থ এই নয় যে কোনও forলুপ লেখার সময় mapআরও উপযুক্ত (এবং পাঠযোগ্য) হবে। একটি সুখী মাধ্যম আছে।
ব্রায়ান ম্যাকচ্যাচন

73

আমি বিশ্বাস করি আপনি যে পয়েন্টগুলি উত্থাপন করেছেন তার একটির উত্তর আমার কাছে আছে যা অন্যরা উত্থাপন করেনি।

জাভা কোনও অনুমান না করে সংকলন-সময় প্রোগ্রামার ত্রুটি সনাক্তকরণের জন্য অনুকূল করে

প্রোগ্রামার ইতিমধ্যে স্পষ্টভাবে তার অভিপ্রায় প্রকাশ করার পরে জাভা কেবল উত্স কোড সম্পর্কিত তথ্যগুলি অনুমান করে tend জাভা সংকলক কোডটি সম্পর্কে কখনই কোনও অনুমান করে না এবং কেবলমাত্র অনর্থক কোড হ্রাস করার জন্য অনুমিত ব্যবহার করে।

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

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

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

জাভাতে এটি করার দুটি উপায় রয়েছে:

  1. ব্যবহার করুন Triplet<A, B, C>(রিটার্ন টাইপ হিসাবে যা সত্যিই হওয়া উচিত java.util, এবং আমি সত্যিই না ব্যাখ্যা করতে কেন এটা হয় না। বিশেষ করে যেহেতু JDK8 পরিচয় করিয়ে Function, BiFunction, Consumer, BiConsumer, ইত্যাদি ... এটা ঠিক যে মনে হয় Pairএবং Tripletকমপক্ষে ইন্দ্রিয় করতে হবে। কিন্তু আমি একমত নই )

  2. সেই উদ্দেশ্যে আপনার নিজস্ব মানের ধরণ তৈরি করুন, যেখানে প্রতিটি ক্ষেত্রের নাম দেওয়া হয়েছে এবং সঠিকভাবে টাইপ করা হয়েছে।

এই উভয় ক্ষেত্রেই সংকলক গ্যারান্টি দিতে পারে যে আপনার ফাংশন এটি ঘোষিত ধরণের ফিরতি দেয় এবং কলার বুঝতে পারে যে প্রতিটি প্রত্যাবর্তিত ক্ষেত্রের ধরন কী এবং সেগুলি অনুসারে সেগুলি ব্যবহার করে।

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

টাইপস্ক্রিপ্ট (বা প্রবাহের ধরণ) এর মতো এমন কিছু বিবেচনা করুন যেখানে স্পষ্টত টাইপিংয়ের পরিবর্তে টাইপ অনুমান ব্যবহার করা হয়।

function parseDurationInMillis(csvLine){
    // here the developer intends to return a Number, 
    // but actually it's a String
    return csv.firstField();
}

// Compiler infers that parseDurationInMillis is String, so it does
// string concatenation and infers that plusTwoSeconds is String
// Developer actually intended Number
var plusTwoSeconds = 2000 + parseDurationInMillis(csvLine);

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


নোট করুন যে সঠিক অবজেক্ট ওরিয়েন্টেড নীতিগুলি এবং ডোমেন-চালিত মডেলিং অনুসরণ করে, লিঙ্কযুক্ত প্রশ্নে সময়সীকরণ পার্সিং কেসটিকেও একটি java.time.Durationবস্তু হিসাবে ফিরিয়ে দেওয়া যেতে পারে যা উপরের উভয় ক্ষেত্রেই অনেক বেশি স্পষ্ট হবে।


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

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

39
@ টমসমিডিং এটি লক্ষণীয় যে এই যুক্তিটি বিশেষত নির্বোধ কারণ হাস্কেল জাভা থেকে প্রায় পাঁচ বছর বেশি সময় ধরে রয়েছেন । জাভাতে কোনও টাইপ সিস্টেম থাকতে পারে তবে এটি প্রকাশিত হওয়ার পরে এটির শিল্প যথার্থতা যাচাইকরণের অবস্থাও ছিল না।
অ্যালেক্সিস কিং

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

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

50

জাভা এবং পাইথন হ'ল দুটি ভাষা আমি সর্বাধিক ব্যবহার করি তবে আমি অন্য দিক থেকে আসছি। অর্থ্যাৎ পাইথন ব্যবহার শুরু করার আগে আমি জাভা বিশ্বে গভীর ছিলাম তাই আমি সাহায্য করতে সক্ষম হতে পারি। আমি মনে করি "এত এত ভারী জিনিস কেন" এর বৃহত্তর প্রশ্নের উত্তর 2 টিতে নেমে এসেছে:

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

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

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

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

public class Blah 
{
  public static Blah blah(long number, boolean isInSeconds, boolean lessThanOneMillis)
  {
    return new Blah(number, isInSeconds, lessThanOneMillis);
  }

  private final long number;
  private final boolean isInSeconds;
  private final boolean lessThanOneMillis;

  public Blah(long number, boolean isInSeconds, boolean lessThanOneMillis)
  {
    this.number = number;
    this.isInSeconds = isInSeconds;
    this.lessThanOneMillis = lessThanOneMillis;
  }

  public long getNumber()
  {
    return number;
  }

  public boolean isInSeconds()
  {
    return isInSeconds;
  }

  public boolean isLessThanOneMillis()
  {
    return lessThanOneMillis;
  }
}

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

আমি যদি নিজেকে ইতিমধ্যে প্রাসঙ্গিক মনে করি তবে ইতিমধ্যে এমন একটি ধরণ রয়েছে যা এখানে আপনার বেশিরভাগ চাহিদা মেটাবে বলে মনে হয় । এটিকে নির্ধারণ করে, আপনি যে পদ্ধতির ব্যবহার করছেন সেটি জাভার পক্ষে উপযুক্ত নয় কারণ এটি তার দুর্বলতাগুলির পক্ষে খেলে, এটির শক্তি নয়। এখানে একটি সাধারণ উন্নতি:

public class Blah 
{
  public static Blah fromSeconds(long number)
  {
    return new Blah(number * 1000_000);
  }

  public static Blah fromMills(long number)
  {
    return new Blah(number * 1000);
  }

  public static Blah fromNanos(long number)
  {
    return new Blah(number);
  }

  private final long nanos;

  private Blah(long nanos)
  {
    this.nanos = nanos;
  }

  public long getNanos()
  {
    return nanos;
  }

  public long getMillis()
  {
    return getNanos() / 1000; // or round, whatever your logic is
  }

  public long getSeconds()
  {
    return getMillis() / 1000; // or round, whatever your logic is
  }

  /* I don't really know what this is about but I hope you get the idea */
  public boolean isLessThanOneMillis()
  {
    return getMillis() < 1;
  }
}

মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
maple_shaft

2
আমি আপনাকে "আরও আধুনিক" জাভা বৈশিষ্ট্যগুলির প্রতি সম্মানের সাথে স্কালার দিকে নজর দেওয়ার পরামর্শ দিতে পারি ...
মাইকডাব্লু

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

এই উত্তরটি ওপি দ্বারা উত্থাপিত আনুমানিক মান দিকটি চিহ্নিত করে না।
এরিক

@ এরিক "শব্দটির আনুমানিক মান" শব্দটির পাঠ্যটিতে উপস্থিত হয় না। যদি আপনি আমাকে প্রশ্নের উত্তর না দিয়ে নির্দিষ্ট অংশের দিকে নির্দেশ করতে পারেন তবে আমি তা করার চেষ্টা করতে পারি।
জিমি জেমস 14 '

41

আপনি জাভাতে খুব পাগল হওয়ার আগে, দয়া করে আমার উত্তরটি আপনার অন্য পোস্টে পড়ুন

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

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

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

উদাহরণস্বরূপ, আসুন আমরা বলি যে সঠিকভাবে কাজ করার জন্য আপনার সময়কালের সংমিশ্রণের জন্য তুলনা করার জন্য যথাযথতা বা স্কেলটি আসলে কী প্রয়োজন তা সম্পর্কে আরও শিখুন এবং আপনি জানতে পারেন যে "প্রায় 32 মিলিসেকেন্ড ত্রুটি" চিহ্নিত করতে আপনাকে একটি মধ্যবর্তী পতাকা প্রয়োজন (স্কোয়ারের কাছাকাছি) 1000 এর মূল, সুতরাং 1 থেকে 1000 এর মধ্যে অর্ধেক লোগারিথিকভাবে)। আপনি যদি নিজেকে এমন কোডের সাথে আবদ্ধ করেন যা এটি উপস্থাপনের জন্য আদিম ব্যবহার করে, আপনি যে কোডটি পেয়েছেন সেখানে প্রতিটি স্থান খুঁজে পেতে is_in_seconds,is_under_1msএবং এটিতে পরিবর্তন করতে হবেis_in_seconds,is_about_32_ms,is_under_1ms। সব জায়গায় সমস্ত জায়গায় পরিবর্তন করতে হবে! যার দায়বদ্ধতা ত্রুটির মার্জিন রেকর্ড করা এমন একটি শ্রেণি তৈরি করা যাতে এটি অন্য কোথাও গ্রাস করা যায় যাতে আপনার গ্রাহকরা ত্রুটিযুক্ত কিসের মার্জিন বা কীভাবে তারা একত্রিত হয় সে সম্পর্কে কোনও কিছু জানতে বাধা দেয় এবং তাদের কেবল ত্রুটির মার্জিন নির্দিষ্ট করতে দেয় যা প্রাসঙ্গিক এখন. (এটি হ'ল, কোনও ক্লাসে ত্রুটির মাত্রার একটি নতুন মার্জিন যুক্ত করার সময় কোনও গ্রাহক কোডই পরিবর্তন করতে বাধ্য হয় না, যেহেতু ত্রুটির সমস্ত পুরানো মার্জিন এখনও বৈধ।

শেষ বিবৃতি

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

অভিযোজ্য বস্তু

আমি সম্পূর্ণ কৃতজ্ঞতা ও অন্যায়ভাবে যুক্ত করব যে সি # এর স্বয়ংক্রিয় বৈশিষ্ট্য এবং নির্মাতাদের মধ্যে কেবলমাত্র গেট প্রোপার্টি অর্পণ করার ক্ষমতা "জাভা ওয়ে" এর প্রয়োজন হবে এমন কিছুটা আবছা কোড আরও পরিষ্কার করতে সহায়তা করে (স্পষ্টভাবে ব্যক্তিগত বেসিং ক্ষেত্র এবং গিটার / সেটার ফাংশন সহ) :

// Warning: C# code!
public sealed class ApproximateDuration {
   public ApproximateDuration(int lowMilliseconds, int highMilliseconds) {
      LowMilliseconds = lowMilliseconds;
      HighMilliseconds = highMilliseconds;
   }
   public int LowMilliseconds { get; }
   public int HighMilliseconds { get; }
}

এখানে উপরোক্ত একটি জাভা বাস্তবায়ন:

public final class ApproximateDuration {
  private final int lowMilliseconds;
  private final int highMilliseconds;

  public ApproximateDuration(int lowMilliseconds, int highMilliseconds) {
    this.lowMilliseconds = lowMilliseconds;
    this.highMilliseconds = highMilliseconds;
  }

  public int getLowMilliseconds() {
    return lowMilliseconds;
  }

  public int getHighMilliseconds() {
    return highMilliseconds;
  }
}

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

এই বিষয়টির জন্য, এই শ্রেণিটি হ'ল structএকটি মান ধরণের হওয়ার জন্যও শালীন প্রার্থী । কিছু পরীক্ষায় দেখা যাবে যে কোনও কাঠামায় স্যুইচিংয়ের একটি রান-টাইম পারফরম্যান্স সুবিধা রয়েছে (এটি পারে)।


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

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

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

@ সুসানডাব্লু আমি সম্মত আদিম আবেশ অপসারণ করার জন্য রিফ্যাক্টরিং ডোমেন ধারণাগুলি উদঘাটন করার একটি দুর্দান্ত উপায় হতে পারে!
নিউন্টাপির

আমি উদাহরণ হিসাবে একটি আলোচনা হিসাবে জাভা সংস্করণ যোগ। আমি সি # তে সমস্ত ম্যাজিক সিনট্যাকটিকাল চিনির উপরে নেই তবে যদি কিছু অনুপস্থিত থাকে তবে আমাকে জানান।
জিমি জেমস 16 '11

24

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

পাইথন একটি বহু-দৃষ্টান্তের ভাষা যা কোডের স্পষ্টতা এবং সরলতার জন্য উপযুক্ত (পড়া এবং লিখতে সহজ)।

জাভা (traditionতিহ্যগতভাবে) একটি একক-দৃষ্টান্ত শ্রেণিভিত্তিক ওও ভাষা যা ব্যাখ্যা এবং ধারাবাহিকতার জন্য অনুকূল করে তোলে - এমনকি আরও ভার্বোজ কোডের ব্যয় করেও।

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

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

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


+1, তবে স্ক্যালার মতো ক্লাসগুলির সাথে স্ট্যাটিকালি টাইপ করা ভাষার সাথে এই জাল কীভাবে সত্ত্বেও টিপলস প্রবর্তনের প্রয়োজনীয়তা খুঁজে পেয়েছিল? আমি মনে করি টিউপলগুলি কিছু ক্ষেত্রে কেবলমাত্র আরও পরিষ্কার সমাধান, এমনকি বর্গ সহ ভাষাগুলির জন্য।
আন্দ্রেস এফ

@ এন্ড্রেসএফ: জাল বলতে কী বুঝ? স্কালা জাভা থেকে আলাদা একটি ভাষা এবং এর নকশার নীতি এবং আইডিয়ামগুলি আলাদা।
জ্যাকসবি

আমি এটি আপনার 5 ম অনুচ্ছেদের উত্তরে বোঝাতে চেয়েছিলাম, যা "তবে এটি জাভা সংস্কৃতির সাথে সত্যিই মেলে না [[]]"। প্রকৃতপক্ষে, আমি সম্মত হইয়াছি যে ভার্বোসটি জাভা সংস্কৃতির অংশ, তবে টিউপসগুলির অভাব হতে পারে না কারণ তারা "ইতিমধ্যে সুস্পষ্টভাবে ঘোষিত শ্রেণিগুলি ব্যবহার করে" - সর্বোপরি, স্কালায়ও স্পষ্ট ক্লাস রয়েছে (এবং আরও সংক্ষিপ্ত কেস ক্লাস চালু করা হয়েছে ), তবে এটি এছাড়াও tuples অনুমতি দেয়! শেষ পর্যন্ত, আমার মনে হয় সম্ভবত জাভা টিউপসগুলি পরিচয় করিয়ে দেয়নি কেবল ক্লাসগুলি একই অর্জন করতে পারে (আরও বেশি গন্ডগোল সহ), কারণ এটির বাক্য গঠনটি অবশ্যই সি প্রোগ্রামারদের সাথে পরিচিত এবং সি এর টিউপলস ছিল না।
অ্যান্ড্রেস এফ

@ অ্যান্ড্রেসএফ .: বিভিন্ন কাজ করার একাধিক পদ্ধতির বিরুদ্ধে স্কালার বিরূপতা নেই, এটি কার্যকরী দৃষ্টান্ত এবং ক্লাসিকাল ওও উভয়ের বৈশিষ্ট্যগুলিকে একত্রিত করে। এটি সেভাবে পাইথন দর্শনের আরও কাছাকাছি।
জ্যাকবিবি

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

16

অনুশীলনের জন্য অনুসন্ধান করবেন না; এটি সাধারণত একটি খারাপ ধারণা, যেমন সেরা অনুশীলনগুলিতে বলা হয় খারাপ, নিদর্শনগুলি ভাল? । আমি জানি আপনি সেরা অনুশীলনের জন্য জিজ্ঞাসা করছেন না, তবে আমি এখনও মনে করি আপনি সেখানে কিছু প্রাসঙ্গিক উপাদান খুঁজে পাবেন।

আপনার সমস্যার সমাধানের জন্য অনুসন্ধান করা একটি অনুশীলনের চেয়ে ভাল এবং জাভাতে তিনটি মান দ্রুত ফিরিয়ে দেওয়ার জন্য আপনার সমস্যাটি খুব দুর্বল নয়:

  • অ্যারে আছে
  • আপনি ওয়ান-লাইনারে একটি তালিকা হিসাবে অ্যারে ফিরতে পারেন: অ্যারেএস.এললিস্ট (...)
  • আপনি যদি কম বয়লারপ্লেট সম্ভাব্য (এবং কোনও লম্বোক নেই) দিয়ে অবজেক্টটি পাশে রাখতে চান:

class MyTuple {
    public final long value_in_milliseconds;
    public final boolean is_in_seconds;
    public final boolean is_under_1ms;
    public MyTuple(long value_in_milliseconds,....){
        ...
    }
 }

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

শেষ অবধি: আমি প্রচুর সিরিয়ালাইজেশন সরঞ্জামগুলি ব্যবহার করার কারণে গেটারগুলি ব্যবহার করি তবে আমি সেগুলিও লিখি না; আমি লম্বোক ব্যবহার করি: আমি আমার আইডিই দ্বারা সরবরাহিত শর্টকাট ব্যবহার করি।


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

3
আরে, সমস্যার একটি বুদ্ধিমান সমাধান solution [জিএস] ইটারগুলির সাথে পূর্ণ-বর্ধিত ওভার-ইঞ্জিনিয়ারড ওওপি সমাধানের পরিবর্তে কয়েকটি জনসাধারণের সাথে কেবল একটি ক্লাস (/ স্ট্রাক্ট) লেখার পক্ষে এটি যুক্তিযুক্ত বলে মনে হয়।
টমসডিং

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

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

2
@ পিটারমোরটেনসেন এটি একটি জাভা গ্রন্থাগার যা প্রচুর পরিমাণে সম্পর্কযুক্ত কাজ করে। যদিও এটি খুব ভাল। এখানে বৈশিষ্ট্যগুলি রয়েছে
মাইকেল মাইকেল

11

সাধারণভাবে জাভা আইডিয়ামগুলি সম্পর্কে:

জাভা সব কিছুর জন্য ক্লাস করার বিভিন্ন কারণ রয়েছে। আমার জ্ঞান যতদূর যায় তার মূল কারণ হ'ল:

নতুনদের জন্য জাভা শিখতে সহজ হওয়া উচিত। আরও স্পষ্টত বিষয়গুলি, গুরুত্বপূর্ণ বিশদটি মিস করা তত কঠিন। কম ম্যাজিক ঘটে যা প্রাথমিকভাবে উপলব্ধি করা শক্ত হবে।


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

আপনি লম্বোকের মতো সরঞ্জামগুলির সাথে বয়লারপ্লেট হ্রাস করতে পারেন:

@Value
class MyTuple {
    long value_in_milliseconds;
    boolean is_in_seconds;
    boolean is_under_1ms;
}

5
এটি গুগলের অটোভ্যালু
ইভান

এ কারণেই জাভা প্রোগ্রামগুলি তুলনামূলকভাবে সহজে বজায় রাখা যায়!
থরবজর্ন রাভন অ্যান্ডারসন

7

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

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

ক্ষেত্রগুলি সহ "স্ট্রাক্ট" ক্লাস

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

   class ParseResult0 {
      public final long millis;
      public final boolean isSeconds;
      public final boolean isLessThanOneMilli;

      public ParseResult0(long millis, boolean isSeconds, boolean isLessThanOneMilli) {
         this.millis = millis;
         this.isSeconds = isSeconds;
         this.isLessThanOneMilli = isLessThanOneMilli;
      }
   }

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

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

ইন্টারফেস হিসাবে "স্ট্রাকচারস"

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

   interface ParseResult {
      long getMillis();

      boolean isSeconds();

      boolean isLessThanOneMilli();

      static ParseResult from(long millis, boolean isSeconds, boolean isLessThanOneMill) {
         return new ParseResult() {
            @Override
            public boolean isSeconds() {
               return isSeconds;
            }

            @Override
            public boolean isLessThanOneMilli() {
               return isLessThanOneMill;
            }

            @Override
            public long getMillis() {
               return millis;
            }
         };
      }
   }

এটি এখনও প্রচুর বয়লারপ্লেট, আমি একেবারে একমত, তবে বেশ কয়েকটি সুবিধাও রয়েছে এবং আমি মনে করি সেগুলি আপনার মূল প্রশ্নের কয়েকটি উত্তর দেওয়া শুরু করে।

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

return (true, 500, false)

যখন আপনি বোঝাতে চেয়েছিলেন:

return (500, true, false)

এই জাতীয় জাভা ইন্টারফেসের সাহায্যে আপনি সংকলন করতে পারবেন না:

return ParseResult.from(true, 500, false);

মোটেই তোমাকে করতে হবে:

return ParseResult.from(500, true, false);

সাধারণভাবে স্ট্যাটিক্যালি টাইপ করা ভাষার এটি একটি সুবিধা a

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

ভুল কাজটি করা কঠিন করা

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

অনুশীলনে, আপনি সত্যিই টাইমউনাইট এবং সময়কাল ব্যবহার করতে চাইতে পারেন, যাতে আপনার ফলাফল যেমন হয়:

   interface Duration {
      TimeUnit getTimeUnit();

      long getDuration();

      static Duration from(TimeUnit unit, long duration) {
         return new Duration() {
            @Override
            public TimeUnit getTimeUnit() {
               return unit;
            }

            @Override
            public long getDuration() {
               return duration;
            }
         };
      }
   }

   interface ParseResult2 {

      boolean isLessThanOneMilli();

      Duration getDuration();

      static ParseResult2 from(TimeUnit unit, long duration) {
         Duration d = Duration.from(unit, duration);
         return new ParseResult2() {
            @Override
            public boolean isLessThanOneMilli() {
               return false;
            }

            @Override
            public Duration getDuration() {
               return d;
            }
         };
      }

      static ParseResult2 lessThanOneMilli() {
         return new ParseResult2() {
            @Override
            public boolean isLessThanOneMilli() {
               return true;
            }

            @Override
            public Duration getDuration() {
               throw new IllegalStateException();
            }
         };
      }
   }

এটি অনেক বেশি কোড হতে চলেছে তবে আপনাকে কেবল এটি একবার লিখতে হবে, এবং ( আপনার কোডটি সঠিকভাবে নথিভুক্ত করে ধরে নিয়েছেন), আপনার কোডটি ব্যবহার করে এমন লোকেরা ফলাফলটির অর্থ কী তা অনুমান করতে হবে না, এবং ঘটনাক্রমে result[0]যখন বোঝাতে চাইছে তেমন কিছু করতে পারে না result[1]। আপনি এখনও চমত্কারভাবে দৃষ্টান্তগুলি তৈরি করতে পারেন এবং সেগুলির মধ্যে থেকে ডেটা পাওয়া এতটা শক্ত নয়:

  ParseResult2 x = ParseResult2.from(TimeUnit.MILLISECONDS, 32);
  ParseResult2 y = ParseResult2.lessThanOneMilli();

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

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

আপনি কেবল এই কাঠামোগুলি একবার লিখেছেন , তবে আপনি এগুলি বহুবার তৈরি করেন, তাই আপনি এখনও সেই সংক্ষিপ্ত সৃষ্টিটি (যা আপনি পেয়েছেন) চান না। স্ট্যাটিক টাইপিং নিশ্চিত করে যে আপনি যে ডেটা বের করে আসছেন সেটিই আপনার প্রত্যাশা।

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


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

আমি কোনও গেটর তৈরি করিনি, তবে এখন আমি দেখছি কীভাবে একজন প্রাপ্ত ব্যক্তি আমাকে একটি ব্যতিক্রম ছুঁড়ে মারতে দেয়, যদি, originalTimeUnit=DurationTimeUnit.UNDER1MSকলার মিলিসেকেন্ডের মানটি পড়ার চেষ্টা করে।
মিখাইল রামেনডিক

আমি জানি আপনি এটি উল্লেখ করেছেন, তবে পাইথন টিপলসের সাথে আপনার উদাহরণটি গতিশীল বনাম স্ট্যাটিচ্যালি টাইপড টিপলস সম্পর্কে সত্যই; এটি নিজেদের টিপলস সম্পর্কে সত্যই বেশি কিছু বলে না। আপনি করতে পারেন স্ট্যাটিক্যালি tuples যা কম্পাইল করার ব্যর্থ হবে টাইপ করেছেন, যেমন আমি নিশ্চিত আপনি জানেন :)
আন্দ্রেজ এফ

1
@ উইড্রাক আমি নিশ্চিত না আপনি কী বোঝাতে চাইছেন। আমার পয়েন্ট এটা আরো verbosely ভালো (যদিও এটা বেশী সময় লাগে), গ্রন্থাগার কোড লিখতে যেহেতু বেশি সময় ব্যয় করা হবে ঠিক আছে ছিল ব্যবহার তুলনায় কোড লেখার করুন।
জোশুয়া টেলর

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

7

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

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

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

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


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

5

এই তিনটি ভিন্ন কারণ যা আপনি পর্যবেক্ষণ করছেন তাতে অবদান রাখে।

টিপলস বনাম নামের ক্ষেত্রগুলি

সম্ভবত সবচেয়ে তুচ্ছ - অন্যান্য ভাষায় আপনি একটি টুপল ব্যবহার করেছেন। টিউপসগুলি একটি ভাল ধারণা কিনা তা নিয়ে বিতর্ক করা আসলেই মূল বিষয় নয় - তবে জাভাতে আপনি একটি ভারী কাঠামো ব্যবহার করেছিলেন যাতে এটি কিছুটা অন্যায় তুলনা করা যায়: আপনি অবজেক্টগুলির একটি অ্যারে এবং কোনও ধরণের castালাই ব্যবহার করতে পারতেন।

ভাষার বাক্য গঠন

ক্লাস ঘোষণা করা কি আরও সহজ হতে পারে? আমি ক্ষেত্রগুলি পাবলিক করার বা মানচিত্র ব্যবহার করার কথা বলছি না তবে স্কালার কেস ক্লাসগুলির মতো এমন কিছু যা আপনার বর্ণিত সেটআপের সমস্ত সুবিধা সরবরাহ করে তবে আরও সংক্ষিপ্ত:

case class Foo(duration: Int, unit: String, tooShort: Boolean)

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

ভাষার দর্শন

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

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

কেন ইউনিট থেকে সময়কাল পৃথক? প্রচুর টাইম লাইব্রেরি রয়েছে যা আপনাকে একটি সময়কাল ঘোষণা করতে দেয় - সময়কাল (5, সেকেন্ড) এর মতো কিছু (বাক্য গঠন আলাদা হবে), যা আপনাকে আরও শক্তিশালী উপায়ে যা খুশি তাই করতে দেয়। হতে পারে আপনি এটি রূপান্তর করতে চান - ফলাফল [1] (বা [2]?) একটি 'ঘন্টা' এবং 3600 দ্বারা গুণমান কেন পরীক্ষা করে দেখুন? এবং তৃতীয় যুক্তির জন্য - এর উদ্দেশ্য কী? আমি অনুমান করতে পারি যে কোনও সময় আপনাকে "1 মিমের চেয়ে কম" বা আসল সময়টি প্রিন্ট করতে হবে - এটি এমন কিছু যুক্তি যা স্বাভাবিকভাবেই সময়ের সাথে সম্পর্কিত data অর্থাৎ আপনার মতো ক্লাস করা উচিত:

class TimeResult {
    public TimeResult(duration, unit, tooShort)
    public String getResult() {
        if tooShort:
           return "too short"
        else:
           return format(duration)
}

}

বা আপনি যা যা করতে চান তা ডেটা দিয়েই করা যায়, তাই যুক্তিটিকে যুক্ত করে।

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

তবে জাভাতে ক্লাসগুলি কেন "ভারী কাঠামো" সে সম্পর্কে আমার দৃষ্টিভঙ্গি হ'ল আপনি এগুলি ডেটা ধারক হিসাবে ব্যবহার করার উদ্দেশ্যে নয় বরং যুক্তির স্ব-সংযুক্ত কক্ষ হিসাবে ব্যবহার করছেন।


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

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

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

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

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

5

আমার বোঝার মূল কারণগুলি হ'ল

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

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


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

এবং আমি "টিপলস জাভাতে ভাল কাজ করে না" -র সাথে সম্মত। যদি আপনি জেনেরিক ব্যবহার করেন তবে এটি খুব তাড়াতাড়ি দুষ্টু হয়ে যাবে।
থরবজর্ন রাভন অ্যান্ডারসন

@ থোরবজর্নআরভানএন্ডারসেন তারা স্ক্যালায় জেনারিকস এবং টিপলস সহ একটি স্ট্যাটিটিকালি টাইপড ভাষাতে বেশ ভাল কাজ করে । তাহলে সম্ভবত এই জাভা এর দোষ?
আন্দ্রেস এফ

@AndresF। দয়া করে নোট করুন "যদি আপনি জেনেরিক ব্যবহার করেন" - পার্ট। জাভা যেভাবে এটি করে তা জটিল নির্মাণগুলিতে যেমন Has যেমন হাস্কেলের বিপরীতে leণ দেয় না। তুলনা করার জন্য আমি স্ক্যালাকে ভালভাবে জানি না, তবে এটি কি সত্য যে স্কালা একাধিক রিটার্ন মানগুলির জন্য অনুমতি দেয়? এটি যথেষ্ট সাহায্য করতে পারে।
থোরবজর্ন রাভন অ্যান্ডারসন

@ থরবজর্নআরভানএন্ডারসন স্কালা ফাংশনগুলির একটি একক রিটার্ন মান রয়েছে যা টিউপল ধরণের হতে পারে (যেমন def f(...): (Int, Int)একটি ফাংশন fযা এমন মান প্রদান করে যা পূর্ণসংখ্যার টুপল হয়ে থাকে)। আমি নিশ্চিত নই যে জাভাতে জেনেরিকগুলি এর সাথে সমস্যা; মনে রাখবেন যে উদাহরণস্বরূপ হাস্কেলও ক্ষয় টাইপ করে। জাভাতে টিপলস না থাকার কারিগরি কারণ আছে বলে আমি মনে করি না।
আন্দ্রেস এফ।

3

আমি জ্যাকবি এর উত্তর দিয়ে একমত

জাভা হ'ল (traditionতিহ্যগতভাবে) একক-দৃষ্টান্ত শ্রেণিভিত্তিক ওও ভাষা যা ব্যাখ্যা এবং ধারাবাহিকতার জন্য অনুকূল করে

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

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

অন্য কথায়, জাভা সংস্কৃতি ম্যানেজারদের বিশ্বাস করে যে তারা সফ্টওয়্যার বিকাশ বুঝতে পারে তা তৈরি করার জন্য অনুকূলিত।

বা, যেমন একজন জ্ঞানী লোক এটি অনেক দিন আগে রেখেছিল ,

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


3

(এই উত্তরটি জাভা সম্পর্কিত বিশেষত কোনও ব্যাখ্যা নয়, তবে এর পরিবর্তে "[ভারী] অনুশীলনগুলি কীসের জন্য অনুকূল হতে পারে?") এর সাধারণ প্রশ্নকে সম্বোধন করে))

এই দুটি নীতি বিবেচনা করুন:

  1. আপনার প্রোগ্রামটি যখন সঠিক জিনিসটি করে তখন এটি ভাল। আমাদের সঠিক প্রোগ্রামটি লেখার পক্ষে সহজ করা উচিত।
  2. আপনার প্রোগ্রামটি যদি ভুল কাজ করে তবে এটি খারাপ। আমাদের ভুল কাজগুলি করা প্রোগ্রাম লিখতে আরও কঠিন করা উচিত।

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

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

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

অন্যান্য উদাহরণ যা আপনার সিস্টেমকে আরও "ভারী" করে তোলে:

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

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

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


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


1
কোড পড়ার বিষয়ে কী ? সেখানে আরও একটি ট্রেড অফ রয়েছে। উদ্ভট পদার্থ এবং প্রচুর অনুষ্টানের দ্বারা ভারিত কোডগুলি পড়া আরও শক্ত; আপনার আইডিই-তে বয়লারপ্লেট এবং অযথা পাঠ্য (এবং শ্রেণি শ্রেণিবিন্যাস!) দিয়ে কোডটি আসলে কী করছে তা দেখা শক্ত হয়ে ওঠে। আমি এই যুক্তিটি দেখতে পাচ্ছি যে কোডটি লেখার পক্ষে অগত্যা সহজ হওয়া উচিত নয় (এটির সাথে আমি একমত হয়েছি কিনা তা নিশ্চিত নয় তবে এটির কিছুটা যোগ্যতা রয়েছে) তবে এটি অবশ্যই পড়া সহজ হওয়া উচিত । স্পষ্টতই জটিল কোডটি জাভা দিয়ে তৈরি করা হয়েছে এবং তৈরি করা হয়েছে - অন্যথায় দাবি করা বোকামি হবে - তবে এটি কি তার অক্ষর দ্বারা ধন্যবাদ বা এটি সত্ত্বেও ?
Andres F.

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

2

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

সুপারিশকে প্রভাবিত করছে তার একটি অংশ পাইথন এবং জাভাতে যা পাঠযোগ্য এবং রক্ষণাবেক্ষণযোগ্য হিসাবে বিবেচিত হয় তা খুব আলাদা।

  • পাইথনে, টিপল একটি ভাষার বৈশিষ্ট্য।
  • জাভা এবং সি # উভয় ক্ষেত্রে, টিপলটি একটি লাইব্রেরি বৈশিষ্ট্য (বা হবে) ।

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

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

জাভা ভাষার বৈশিষ্ট্যগুলি সংশোধন না করা পর্যন্ত সর্বাধিক পঠনযোগ্য এবং রক্ষণাবেক্ষণযোগ্য সমাধান হ'ল ডেডিকেটেড অবজেক্ট। এটি ১৯৯৫ সালে শুরু হওয়া ভাষায় সীমাবদ্ধতার কারণে। মূল লেখকদের আরও অনেকগুলি ভাষা বৈশিষ্ট্য ছিল যা এটিকে কখনও তৈরি করেনি এবং সময়ের সাথে সাথে জাভার বিবর্তনকে ঘিরে মূল প্রতিবন্ধকতাগুলির পিছনে সামঞ্জস্যতা অন্যতম const


4
সি # এর সর্বশেষতম সংস্করণে নতুন টিপলগুলি গ্রন্থাগার ক্লাসের চেয়ে প্রথম শ্রেণির নাগরিক are এটি পেতে অনেকগুলি সংস্করণ লেগেছিল।
ইগর সলয়ডেনকো

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

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

@ ইগরসোলয়েডেনকো, সম্ভবত জাভা 9-র আশা রয়েছে? ল্যাম্বডাসের লজিকাল পরবর্তী ধাপে এটি এমন বৈশিষ্ট্যগুলির মধ্যে একটি।
বেরিন লরিটস

1
@ ইগরসোলয়েডেনকো আমি নিশ্চিত নই যে এটি বেশ সত্য (প্রথম শ্রেণির নাগরিক) - তারা সিএলআরতে ক্লাস, কাঠামো, এনাম ডু হিসাবে ক্লাসের প্রথম শ্রেণির সমর্থন পাওয়ার পরিবর্তে লাইব্রেরি থেকে ক্লাসের উদাহরণ তৈরি এবং আন-মোড়ক সিনট্যাক্স এক্সটেনশন বলে মনে হচ্ছে।
পিট কিরখাম

0

আমি মনে করি এই ক্ষেত্রে ক্লাস ব্যবহার করার মূল বিষয়গুলির মধ্যে একটি হ'ল যা একসাথে যায় তা একসাথে থাকা উচিত।

পদ্ধতির যুক্তি সম্পর্কে আমি অন্যভাবে এই আলোচনাটি করেছি: বিএমআই গণনা করে এমন একটি সহজ পদ্ধতি বিবেচনা করুন:

CalculateBMI(weight,height)
{
  System.out.println("BMI: " + (( weight / height ) x 703));
}

এই ক্ষেত্রে আমি এই স্টাইলের বিরুদ্ধে তর্ক করব কারণ ওজন এবং উচ্চতা সম্পর্কিত। পদ্ধতিটি "যোগাযোগ করে" সেগুলি যখন না থাকে তখন সেগুলি দুটি পৃথক মান। আপনি কখন একজন ব্যক্তির ওজন এবং অন্য ব্যক্তির উচ্চতা নিয়ে BMI গণনা করবেন? এটা কোন মানে হবে না।

CalculateBMI(Person)
{
  System.out.println("BMI: " + (( Person.weight / Person.height ) x 703));
}

অনেক বেশি অর্থবোধ করে কারণ এখন আপনি স্পষ্টভাবে যোগাযোগ করেছেন যে উচ্চতা এবং ওজন একই উত্স থেকে এসেছে।

একাধিক মান ফেরত দেওয়ার ক্ষেত্রে এটি একই রকম। যদি তারা স্পষ্টভাবে সংযুক্ত থাকে তবে একটি ঝরঝরে সামান্য প্যাকেজ ফিরিয়ে দিন এবং কোনও বস্তু ব্যবহার করুন, যদি তারা একাধিক মান না ফেরায়।


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

1
@ আর্টেম এটি পরবর্তী পদক্ষেপ যেখানে ইন্টারফেসগুলি কার্যকর হয়। সুতরাং একটি ব্যক্তির ওজন উচ্চতা ইন্টারফেস কিছু হতে পারে। আপনি যে উদাহরণটি দিয়েছিলেন তাতে ধরা পড়ে যাচ্ছেন যা একসাথে ঘটে তা একসাথে হওয়া উচিত make
পিটার বি

0

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

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

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

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


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

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