জাভা এর সর্বজনীন ক্ষেত্রগুলি কি এই মুহুর্তে কেবল একটি ট্র্যাজিক historicalতিহাসিক নকশার ত্রুটি রয়েছে? [বন্ধ]


17

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

ধন্যবাদ!

আপডেট: আমি আরও মার্জিত পদ্ধতির সম্পর্কে জানি, যেমন সি #, পাইথন, গ্রোভি ইত্যাদি I'm আমি সরাসরি সেই উদাহরণগুলি খুঁজছি না। আমি সত্যিই ভাবছি যে এখনও কোনও বাঙ্কারের গভীরে কেউ আছে, পাবলিক ফিল্ডগুলি আসলেই কত দুর্দান্ত, এবং জনসাধারণ কীভাবে সমস্ত ন্যায়বিচারে ভেড়া ইত্যাদি নিয়ে বিচলিত হয় তা নিয়ে কি না if

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


2
আপনার ভিত্তি কী যে তারা সত্যই একটি ত্রুটি?
অ্যারন ম্যাকআইভার

1
জাভাতে এখন প্রতীকী ধ্রুবক অভিব্যক্তি তৈরি করার আলাদা উপায় আছে কি?
এডওয়ার্ড স্ট্রেঞ্জ

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

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

উত্তর:


14

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

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

এটি অপরিবর্তনীয় শ্রেণিতে public finalক্ষেত্রগুলির জন্য একটি কার্যকর ডিজাইন ।

কার্যকর জাভা থেকে :

আইটেম 14: পাবলিক ক্লাসে অ্যাক্সেসর পদ্ধতি ব্যবহার করুন, সর্বজনীন ক্ষেত্রগুলি নয়

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

যদিও কোনও সরকারী শ্রেণীর পক্ষে সরাসরি ক্ষেত্রগুলি উন্মুক্ত করা কখনই ভাল ধারণা নয়, ক্ষেত্রগুলি অপরিবর্তনীয় থাকলে কম ক্ষতিকারক।

আরও দেখুন জাভাবীনের পরিবর্তে কেন আমি অপরিবর্তনীয় POJO ব্যবহার করব না?


কেবল ভাবছি, কোনও এপিআইতে এটি প্রকাশ না করার জন্য আপনার কারণগুলি কী?
স্টিভেন জিউরিস

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

@ জোনাস: এগুলি প্রথম স্থানে স্থায়ীদের প্রার্থী নয়।
স্টিভেন জিউরিস

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

@ জোনাস: এটিও দুর্দান্ত ব্যবহারের কেস! আপনার উত্তরটি পরিষ্কার করতে কিছুটা আপডেট করা সম্ভবত এটি সহায়ক।
স্টিভেন জিউরিস

9

গেট / সেট পদ্ধতির জোড়ার ব্যবহার হ'ল ট্র্যাজিক historicalতিহাসিক ডিজাইনের ত্রুটি। আমি আর একটি ভাষা ভাবতে পারি না যা গুণবাচক এবং অকার্যকর হিসাবে বৈশিষ্ট্যগুলি প্রয়োগ করে।


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

5

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


2
java.awt.Pointএবং বন্ধুরা কিছুটা দুঃস্বপ্ন।
টম হাটিন -

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

সুতরাং আমি যদি Pointএটি পেয়ে এবং এটি সংশোধন করি তবে আমার কী প্রত্যাশা করা উচিত যা এটি স্ক্রিনে পরিষ্কারভাবে আপডেট করার জন্য বোঝায়? না, সমস্যাটি Pointহ'ল এটি পরিবর্তনীয়। আমাদের ছিল String/ StringBufferকিন্তু ধারণাটি পেরেছে বলে মনে হচ্ছে না। / চারপাশে অ্যারে পাস করার ক্ষেত্রেও একই রকম সমস্যা রয়েছে।
টম হাটিন -

5

পাবলিক কনস্ট্যান্টগুলি সংজ্ঞায়িত করতে এটি এখনও কার্যকর। যেমন

সর্বজনীন স্ট্যাটিক ফাইনাল ইন DAYS_IN_WEEK = 7;

তবে, যেখানে সম্ভব এনামকে পছন্দ করবেন না prefer যেমন

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, 
    THURSDAY, FRIDAY, SATURDAY 
}

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

class Point
{
    public int x, y;
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

তবে তারপরেও অনেকে যুক্তি দিয়েছিলেন যে জাভা জাতীয় ভাষায়

1
@ ডেলানন: এগুলি জাভাবীনের মতো প্রায় একই, তবে জাভাবিয়ান থ্রেডসেফের চেয়ে অনেক বেশি ভার্বোজ। দেখুন কেন আমি জাভাবীনের পরিবর্তে অপরিবর্তনীয় POJO ব্যবহার করব না?
জোনাস

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

2

আইডিইগুলি ব্যাপক আকারে ছড়িয়ে পড়ার আগে, আপনার সমস্ত ক্ষেত্রগুলিকে সর্বজনীন করে তোলা ধারণাগুলির প্রোটোটাইপ / প্রমাণগুলি দ্রুত তৈরি করার একটি শক্তিশালী সরঞ্জাম।

আজকাল এগুলি ব্যবহারের খুব অজুহাত রয়েছে, যখন আপনি মাউসের একটি ক্লিকে একটি গিটার / সেটার জুড়ি তৈরি করতে পারেন।


4
তবে 10 টি public finalক্ষেত্র 10 getXXX()পদ্ধতির চেয়ে বেশি পঠনযোগ্য ।
জোনাস

1
@ জোনাস হ্যাঁ, তবে আমরা এখানে চূড়ান্ত ক্ষেত্রগুলির বিষয়ে কথা বলছি না। যদি আপনার সর্বজনীন চূড়ান্ত ক্ষেত্রগুলিও স্থিতিশীল হয় তবে সেগুলি ধ্রুবক এবং একটি constকীওয়ার্ড যথেষ্ট হবে যদি তারা স্থির না হয় তবে এগুলি এনক্যাপসুলেশনের মারাত্মক লঙ্ঘন।
বাইজিক্লোপ

3
উইকিপিডিয়া অনুসারে @ বিজিক্লপ : "যদিও জাভাতে একটি কীওয়ার্ড হিসাবে সংরক্ষিত থাকলেও কনস্ট ব্যবহার করা হয় না এবং এর কোনও কার্যকারিতা নেই"
আভি ফ্ল্যাক্স

@ অভি ফ্ল্যাক্স হ্যাঁ, তবে এটি ধ্রুবকগুলি চিহ্নিত করতে ব্যবহার করা যেতে পারে, ফলে ধ্রুবকগুলিকে পাবলিক ফিল্ড হিসাবে ঘোষণা করার প্রয়োজনীয়তা দূর করে।
বিজিকলপ

2
একজন গেটর / সেটার জুটি মোটামুটি উপযুক্ত, এটি ধরে নেওয়া। এটি প্রায়শই হয় না।
ডেভিড থর্নলি

2

এটি সাবজেক্টিভ তবে আমার মতামতটি সম্পূর্ণ পাবলিক / প্রাইভেট ধারণাটি পুরানো এবং পিছনের দিকে।

অজগরটিতে সরকারী / ব্যক্তিগত কোনও নেই; মূলত সবকিছুই প্রকাশ্য। অনেক সমস্যা সৃষ্টি করে নি।

জাভাতে আপনি "পাবলিক" চিহ্নিত করার পাপ এড়াতে প্রতিটি ক্ষেত্রের জন্য অর্থহীন গেটার / সেটার তৈরির ঝোঁক রাখেন। (আইএমএইচওও যদি আপনি নিজেকে এমনটি করে দেখেন যে কেবল তাদের সর্বজনীন হিসাবে চিহ্নিত করা উচিত)।


পাইথন আপনাকে __ দিয়ে নামের উপসর্গ করে জিনিসগুলিকে ব্যক্তিগত হিসাবে চিহ্নিত করতে দেয়। এটি 100% ব্যক্তিগত নয়, যেহেতু এখনও এই পরিবর্তনগুলি এবং পদ্ধতিগুলি অ্যাক্সেস করার বিভিন্ন উপায় রয়েছে তবে সি # তে আপনি প্রতিফলনের সাথে একই জিনিস করতে পারেন।
অ্যাডাম লিয়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.