কিছু ব্যবহারকারীর জন্য বৈশিষ্ট্যগুলি লুকানো / অক্ষম করা হচ্ছে


11

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

প্রারম্ভের সময় লোড হয় (যেমন নিখরচায় / অর্থ প্রদান) ফ্ল্যাগের উপর ভিত্তি করে বৈশিষ্ট্য প্রাপ্যতা টগল করার কি কোনও প্যাটার্ন রয়েছে?

আমি কোথাও কোথাও কোড ব্লক থাকার ধারণাটি পছন্দ করি না:

if(isFreeVersion){
    // ...
} else {
    // ...
}

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

একটি একক কোড বেস থাকা এবং শর্তসাপেক্ষ বিবৃতি দিয়ে কোডটি লিটারে না ফেলা / নিখরচায় পতাকাটি চেক করার সময় কী কী এমন উপায় আছে?

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

আমরা অ্যান্ড্রয়েড / জাভা ব্যবহার করি।



@gnat tnx, সুন্দর সন্ধান করুন। তবে আমি এমন বিকল্পগুলি নিয়ে আলোচনা করতে চাই যার জন্য পৃথক শাখা এবং একাধিক
কোডবেইস

2
এটি বিভিন্ন অনুমোদনের স্তর থাকার অনুরূপ। আপনি সম্ভবত সেই সমস্যাটি কীভাবে মোকাবেলা করছেন তা সন্ধান করতে পারেন, যেখানে কোনও বৈশিষ্ট্য কেবল নির্দিষ্ট ব্যবহারকারীর / ভূমিকার জন্যই উপলভ্য।
বার্ট ভ্যান ইনজেন শেনৌ

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

2
পলিফর্মিজম ব্যবহার করুন। আবার বিবৃতি দিলে আপনাকে এ সম্পর্কে নিজেকে জিজ্ঞাসা করতে হবে না এবং এটি বজায় রাখা খুব সহজ হবে!
স্টিভ চ্যামিলার্ড

উত্তর:


9

আপনি যদি if/elseব্লকগুলি পছন্দ করেন না , তবে আপনি উত্তরাধিকার ব্যবহারের জন্য তাদের রিফ্যাক্টর করতে পারেন ( মেরিন ফাউলারের রিফ্যাক্টরিং বই থেকে পলিমারফিজমের সাথে শর্তাধীন প্রতিস্থাপন দেখুন )। এটি হবে:

  • আপনার কোড সম্পর্কে যুক্তিযুক্ত করতে এটিকে কিছুটা সহজ করুন।

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

  • আপনার সফ্টওয়্যারটির অন্যান্য ফর্ম যেমন একটি সস্তা বৈকল্পিক বা একটি প্রিমিয়াম সংস্করণ যুক্ত করার জন্য এটি পরে সহজ করুন। আপনি কেবলমাত্র অন্য শ্রেণিটি যুক্ত করবেন, এবং এটি আপনার কোডে একবার ঘোষণা করবেন এবং আপনি জানতে পারবেন পুরো কোড বেসটি এখনও প্রত্যাশা অনুযায়ী কাজ করবে।


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

15

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

"if(isFreeVersion) " বিভিন্ন বৈশিষ্ট্যের জন্য অভ্যন্তরীণ কনফিগারেশন বিকল্পগুলির একটি তালিকা সেট আপ করতে ব্যবহার করা উচিত। ফলাফলের কোডটি এর পরে দেখতে পেল:

 if(isFreeVersion)
 {
      feature1Enabled=false;
      feature2Enabled=false;
      maxNoOfItems=5;
      advertisingStrategy=new ShowLotsOfAdvertisementsStrategy();
      // ...
 } 
 else
 {
      feature1Enabled=true;
      feature2Enabled=true;
      maxNoOfItems=int.MaxValue; // virtually unlimited
      advertisingStrategy=new ShowMinimalAdvertisementsStrategy();
 }

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

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

অবশেষে আমাদের ফিচার টগলস সম্পর্কিত ফওলারের ব্লগ নিবন্ধটি একবার দেখে নেওয়া যাক যেখানে তিনি বৈশিষ্ট্য এন্ট্রি পয়েন্ট / টগল পয়েন্ট সম্পর্কে কথা বলেছেন। আমাকে একটি কেন্দ্রীয় পয়েন্ট উল্লেখ করি:

টগল দিয়ে নতুন বৈশিষ্ট্য কোডের প্রতিটি কোড পাথকে সুরক্ষিত করার চেষ্টা করবেন না, কেবলমাত্র প্রবেশের পয়েন্টগুলিতে ফোকাস করুন যা সেখানে ব্যবহারকারীদের নেতৃত্ব দেয় এবং সেই প্রবেশ পয়েন্টগুলি টগল করে।

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


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

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

6

ফিচার টগল প্যাটার্নটি প্রয়োগ করে আপনার প্রশ্নটি বেশ ভাল সমাধান করা যেতে পারে বলে মনে হচ্ছে

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

এছাড়াও কিছু লাইব্রেরি রয়েছে যা এই প্যাটার্নটিকে সমর্থন করে। জাভাতে এফএফ 4 জে নিয়ে কাজ করার অভিজ্ঞতা আমার ছিল তবে আপনি যদি টাইপ করেন তবে আমি অনুমান করব:

feature toggle <whatever language you prefer>

... যে কোনও সার্চ ইঞ্জিনে আপনি বেশ কয়েকটি সমাধান পাবেন।


2

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

আপনি যখন সার্লেটস, জামেস মাইলটস এবং আইডিই প্লাগইনগুলি দেখুন তখন তারা সকলেই একটি প্লাগইন আর্কিটেকচারের ধারণাটি ব্যবহার করে:

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

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

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

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