পাইথনে সুস্পষ্ট অ্যাক্সেস সংশোধকগুলি কেন নেই:


28

যদি 'স্পষ্টতই অন্তর্নিহিতের চেয়ে ভাল হয়' তবে পাইথনে সুস্পষ্ট অ্যাক্সেস সংশোধকগুলি কেন নেই: পাবলিক, সুরক্ষিত, ব্যক্তিগত ইত্যাদি?

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

পাইথন, অন্যথায় নিখুঁত বলে মনে হচ্ছে এমন একটি ভাষা পাইথনে স্পষ্ট করে না দিয়ে কেন অ্যাক্সেস বিধিনিষেধ আরোপ করা হয়েছে তার একটি নিখুঁত ব্যাখ্যা দিয়ে দয়া করে এখানে কেউ আমাকে সহায়তা করতে পারেন?

সম্পাদনা: এখন পর্যন্ত আমি 3 টি প্রস্তাবিত উত্তর দেখেছি এবং আমি বুঝতে পেরেছি যে আমার প্রশ্নের 2 টি অংশ রয়েছে:

  1. উদাহরণস্বরূপ কী কী শব্দ নেই

    private def myFunc(): 
        dostuff....
    

    আইএমও পরিবর্তে কুরুচিপূর্ণ এবং আন্ডারস্কোর টাইপ করা শক্ত। তবে এটি গুরুত্বপূর্ণ বিষয় নয়।

  2. অধিক গুরুত্বের সাথে:

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

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

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


পাইথনে অ্যাক্সেস স্পেসিফায়ারের সম্ভাব্য সদৃশ : ... যা গঠনমূলক না হওয়ার কারণে বন্ধ ছিল।
ফ্রাঙ্ক শায়ারার

2
@ ফ্র্যাঙ্ক এটি আরও গঠনমূলক হওয়ার চেষ্টা করার জন্য এই প্রশ্নটির পুনরায় জিজ্ঞাসা করুন। আমি এগিয়ে গিয়ে মূল প্রশ্নটি মুছে ফেলেছি।

@ মার্ক ট্র্যাপ: আহ ঠিক আছে স্পষ্টির জন্য ধন্যবাদ। আমি কীভাবে আমার ভোট-টু-ক্লোজটি ফিরিয়ে আনতে পারি তা দেখতে পাচ্ছি না।
ফ্র্যাঙ্ক শায়ারার

@ ফ্র্যাঙ্ক এটি নিজের থেকেই দূরে থাকবে।
অ্যাডাম শিখুন

সমস্যাটি private def whateverহ'ল class x: def whatever(self): passএটি একটি শর্টকাট class x: pass; x.whatever = lambda self: pass, সুতরাং মূলত, আপনার নিয়োগের জন্য একটি প্রাইভেট
মডিফিকেটরের

উত্তর:


22

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

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


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

@ ফ্র্যাঙ্ক: "" ব্যক্তিগত "বিভাগে একটি পদ্ধতি স্থাপন করা একটি ইঙ্গিত যা এটি ব্যবহারের আগে আপনার তিনবার চিন্তা করা উচিত, এবং আর কিছু হবে না" আমার কাছে এর সহজ অর্থ হ'ল আমি যখন লেনদেন করছি না তখন আমাকে এ নিয়ে উদ্বিগ্ন হওয়ার দরকার নেই me এর সাথে.
ভেক্টর

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

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

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

10

আমি সন্দেহ করব অ্যাক্সেস পরিবর্তনের অনুপস্থিত হওয়ার মূল কারণটি সরলতা

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

'কনভেনশন অনুসারে, xx বা __x ক্লাসের বাইরে ব্যবহার করা উচিত নয়' বলা তুচ্ছ, তবে পাইথনের গতিশীল অবজেক্টের মডেলটিতে এমনকি একটি স্বরলিপি প্রকাশ করাও মুশকিল।

class ActiveRow(object):
    def __init__(self, **kwargs):
        for name, value in kwargs.items():
            setattr(self, name, value)

কীভাবে অ্যাক্সেসযোগ্যতা নোট করবেন?

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


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

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

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

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

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

8

পাইথন কনভেনশনটি সুরক্ষিত / ব্যক্তিগত সদস্যদের জন্য একটি আন্ডারস্কোর উপসর্গ ব্যবহার করা।

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

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


2
"যদি আপনি বিশেষ কীওয়ার্ড ছাড়াই একই জিনিসটি (কিছুটা আরও নমনীয়তার সাথে) করতে পারেন তবে ভাষাটি আরও ছোট হবে এবং কোডটি আরও সংক্ষিপ্ত হবে" আমার মতে, এটি সাধারণত সত্য নয়। (এমনকি যদি অ্যাক্সেস মডিফায়ারগুলির বিশেষ ক্ষেত্রে এটি সত্য হতে পারে)
বেনজামিনবি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.