তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করে - সর্বদা একটি মোড়ক ব্যবহার করবেন?


78

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

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

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

অন্যান্য গ্রন্থাগারের সাথে আরও জটিল উদাহরণ রয়েছে তা মনে রাখবেন, আমি কি ওভার ইঞ্জিনিয়ারিং করছি বা বেশিরভাগ ক্ষেত্রে এটি কি বিজ্ঞ সতর্কতা?

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


3
লগ 4 এক্সওয়াইজেড একটি শক্তিশালী ট্রেডমার্ক। কোনও লিঙ্কযুক্ত তালিকার জন্য এপিআই যত তাড়াতাড়ি হবে তার চেয়ে শীঘ্রই এর এপিআই পরিবর্তন হবে। দুটোই এখন দীর্ঘ সমস্যার সমাধান।
জব

1
এই এসও প্রশ্নের যথাযথ সদৃশ: স্ট্যাকওভারফ্লো
মাইকেল বর্গওয়ার্ট

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

1
আরও রেফারেন্সের জন্য: এই প্যাটার্নটিকে পেঁয়াজ-আর্কিটেকচার বলা হয় যেখানে বাহ্যিক পরিকাঠামো (আপনি এটিকে বহিরাগত lib বলছেন) একটি ইন্টারফেসের পিছনে লুকিয়ে রয়েছে
বি

উত্তর:


42

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

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


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

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

@ জর্জে-মেরিয়ান যদি আমি কোনও প্রদত্ত এপিআই ব্যবহার এড়াতে না পারি তবে আমি অবশ্যই স্পর্শ পয়েন্টগুলি হ্রাস করতে পারি। প্রশ্নটি হল, আমি কি সব সময় এই চেষ্টা করার চেষ্টা করা উচিত বা এটি অতিরিক্ত কাজ করার জিনিস?
lotoffreetime

2
@ লটসফ্রিটাইম এটি উত্তর দেওয়া একটি কঠিন প্রশ্ন। আমি আমার শেষ দিকে প্রসারিত করেছি। (মূলত, এটি অনেকটা আইএফএসে নেমে এসেছে))
জর্জ মারিয়ান

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

28

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

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

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


"... মোড়কগুলি কেবল তখনই বোধগম্য হয় যখন আপনি ইতিমধ্যে জড়ানোর জন্য প্রয়োজনীয় সমস্ত API গুলি জানেন।" এটি সত্য হবে যদি আমি মোড়কে এপিআইয়ের সাথে মেলে; সম্ভবত আমার "ইনপ্যাপসুলেশন" শব্দটি র‍্যাপারের চেয়ে আরও দৃ strongly়তার সাথে ব্যবহার করা উচিত। আমি এই এপিআই কলগুলিকে "এই প্যারামিটার দিয়ে" কল foo :: লগ () "না করে" এই টেক্সটটি কোনওভাবে লগইন করতে "করবো।
lotoffreetime

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

27

তৃতীয় পক্ষের লাইব্রেরি মোড়ানোর মাধ্যমে আপনি এর উপরে বিমূর্তির একটি অতিরিক্ত স্তর যুক্ত করুন। এর কয়েকটি সুবিধা রয়েছে:

  • আপনার কোড বেস পরিবর্তনগুলি আরও নমনীয় হয়ে ওঠে

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

  • আপনি লাইব্রেরির এপিআই-র স্বাধীনভাবে মোড়কের এপিআই সংজ্ঞা দিতে পারেন

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

  • ইউনিট টেস্টিং সহজ উপায়

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

  • আপনি একটি শিথিলিত যুগল সিস্টেম তৈরি করুন

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


ব্যবহারিক উদাহরণ

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

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

আমরা এখন একটি ইন্টারফেস সংজ্ঞায়িত করতে পারি যা আমরা যে লাইব্রেরিটি ব্যবহার করে শেষ করব তা মোড়ানোর জন্য ব্যবহার করতে যাচ্ছি:

public interface ImageService {
    Bitmap load(String url);
}

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

ধরা যাক আমরা প্রাথমিকভাবে পিকাসো ব্যবহারের সিদ্ধান্ত নিয়েছি। আমরা এখন একটি বাস্তবায়ন লিখতে পারি ImageServiceযার জন্য পিকাসো অভ্যন্তরীণভাবে ব্যবহার করে:

public class PicassoImageService implements ImageService {

    private final Context mContext;

    public PicassoImageService(Context context) {
        mContext = context;
    }

    @Override
    public Bitmap load(String url) {
        return Picasso.with(mContext).load(url).get();
    }
}

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

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

public class UniversalImageLoaderImageService implements ImageService {

    private final ImageLoader mImageLoader;

    public UniversalImageLoaderImageService(Context context) {

        DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
                .cacheInMemory(true)
                .cacheOnDisk(true)
                .build();

        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
                .defaultDisplayImageOptions(defaultOptions)
                .build();

        mImageLoader = ImageLoader.getInstance();
        mImageLoader.init(config);
    }

    @Override
    public Bitmap load(String url) {
        return mImageLoader.loadImageSync(url);
    }
}

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

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

public class MockImageService implements ImageService {

    private final Bitmap mMockBitmap;

    public MockImageService(Bitmap mockBitmap) {
        mMockBitmap = mockBitmap;
    }

    @Override
    public Bitmap load(String url) {
        return mMockBitmap;
    }
}

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


1
এটি অস্থির API হিসাবে ঠিক পাশাপাশি প্রয়োগ করে app অন্তর্নিহিত লাইব্রেরি পরিবর্তিত হওয়ার কারণে আমাদের কোডটি 1000 জায়গায় পরিবর্তিত হয় না। খুব সুন্দর উত্তর।
রাবারডাক

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

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

24

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

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

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


4
আমি মনে করি না যে YAGNI অগত্যা এই পরিস্থিতিতে প্রযোজ্য। ভবিষ্যতে আপনার প্রয়োজনের ক্ষেত্রে এটি কার্যকারিতা তৈরির বিষয়ে নয়। এটি স্থাপত্যের মধ্যে নমনীয়তা তৈরির বিষয়ে। যদি সেই নমনীয়তা অপ্রয়োজনীয় হয়, তবে, হ্যাঁ, YAGNI প্রযোজ্য। যাইহোক, এই সংকল্পটি ভবিষ্যতে কখনও কখনও করা হতে পারে যখন পরিবর্তনটি সম্ভবত বেদনাদায়ক হয়ে উঠবে।
জর্জ মারিয়ান

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

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

1
@ জর্জ: এই পরিবর্তনগুলি যদি বেদনাদায়ক হয় তবে আমি মনে করি এটি প্রক্রিয়াটির গন্ধ। জাভাতে, আমি পুরানো ক্লাসগুলির মতো একই নামগুলি সহ নতুন ক্লাস তৈরি করব, তবে ভিন্ন প্যাকেজে, পুরানো প্যাকেজের নামের সমস্ত উপস্থিতি পরিবর্তন করতে এবং স্বয়ংক্রিয় পরীক্ষাগুলি পুনরায় চালু করতে হবে।
কেভিন ক্লিন

1
@ কেভিন এটি আরও কাজ, এবং কেবল মোড়কে হালনাগাদ করা এবং পরীক্ষাগুলি চালানোর চেয়ে আরও ঝুঁকি বহন করে।
জর্জ মারিয়ান

9

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

এটি চেষ্টাটির পক্ষে মূল্যবান কিনা তা আলাদা গল্প। সেই বিতর্ক সম্ভবত দীর্ঘ সময় অব্যাহত থাকবে।

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

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


ইউনিট টেস্টিংয়ের ক্ষেত্রে যেখানে API এর একটি মোককে ইনজেক্ট করতে সক্ষম হওয়া পরীক্ষার অধীনে ইউনিটকে হ্রাস করতে সহায়তা করে, "সম্ভাব্য পরিবর্তন" কোনও কারণ নয়। এটি বলার পরেও এটি এখনও আমার প্রিয় উত্তর হিসাবে এটি কীভাবে আমার মনে হয় তার নিকটতম। চাচা বব কী বলতেন? :)
লট অফফ্রিটাইম

এছাড়াও, ছোট প্রকল্পগুলির (কোনও দল নয়, বেসিক স্পেস ইত্যাদি) এর নিজস্ব নিয়ম রয়েছে যাতে আপনি এটির মতো ভাল অনুশীলন লঙ্ঘন করতে পারেন এবং এটিকে দিয়ে কিছুটা হলেও দূরে সরে যেতে পারেন। তবে এটি একটি আলাদা প্রশ্ন ...
লট অফফ্রিটাইম

1

@ ওডে ইতিমধ্যে যা বলেছে তা ছাড়াও , আমি লগিংয়ের বিশেষ উদ্দেশ্যে এই উত্তরটি যুক্ত করতে চাই।


লগিংয়ের জন্য আমার সবসময় একটি ইন্টারফেস থাকে তবে আমাকে log4fooএখনও কোনও কাঠামো স্থাপন করতে হয়নি।

ইন্টারফেসটি সরবরাহ করতে এবং র‍্যাপারটি লিখতে কেবল আধা ঘন্টা সময় লাগে, সুতরাং আমি অনুমান করি যে এটি যদি অকার্যকর হয়ে যায় তবে আপনি খুব বেশি সময় নষ্ট করবেন না।

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


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

@ ফ্যালকন: আপনি কি সবকিছু মুড়ে ফেলেছেন? ওআরএম, লগ ইন্টারফেস, মূল ভাষার ক্লাস? সর্বোপরি, কখনই বলতে পারবেন না যে কখন আরও ভাল হাশম্যাপের প্রয়োজন হতে পারে।
কেভিন ক্লায়ান

1

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

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


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

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


1

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

তৃতীয় পক্ষের গ্রন্থাগারগুলি আমাদের নির্দিষ্ট প্রয়োজনের জন্য ডিজাইন করা হয়নি

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

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

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

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

তৃতীয় পক্ষের লাইব্রেরিগুলিকে বাস্তবায়নের ক্ষেত্রে বিপুল সময় বাঁচানোর উপায় হিসাবে দেখছি, অন্য কোনও উপায়ে রাখুন, ডিজাইনের সিস্টেমগুলির বিকল্প হিসাবে নয়।


0

তৃতীয় পক্ষের গ্রন্থাগারগুলিতে আমার ধারণা:

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

আমাদের কি তৃতীয় পক্ষের ইউআই লাইব্রেরিগুলি এড়ানো উচিত?

তৃতীয় পক্ষের গ্রন্থাগারগুলি বিবেচনা করার কারণগুলি:

বিকাশকারীরা তৃতীয় পক্ষের গ্রন্থাগারটি ব্যবহার করার দুটি মূল কারণ বলে মনে হচ্ছে:

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

বেশিরভাগ ইউআই লাইব্রেরি ( সমস্ত নয়! ) দ্বিতীয় বিভাগে পড়ার প্রবণতা রয়েছে। এই জিনিসগুলি কোনও রকেট বিজ্ঞান নয়, তবে এটি সঠিকভাবে তৈরি করতে সময় লাগে।

যদি এটি মূল ব্যবসায়ের ফাংশন হয় - এটি নিজেই করুন, তা সে যাই হোক না কেন।

নিয়ন্ত্রণ / দর্শন দুটি ধরণের রয়েছে:

  1. জেনেরিক, আপনি এগুলি তাদের বিভিন্ন প্রসঙ্গে ব্যবহারের অনুমতি দিচ্ছেন এমনকি তাদের নির্মাতারা যেমন ভাবেননি, যেমন UICollectionViewথেকে UIKit
  2. নির্দিষ্ট, একক ব্যবহারের ক্ষেত্রে তৈরি, যেমন UIPickerView। বেশিরভাগ তৃতীয় পক্ষের গ্রন্থাগারগুলি দ্বিতীয় বিভাগে পড়ার প্রবণতা রয়েছে। আরও কি, এগুলি প্রায়শই বিদ্যমান কোডবেস থেকে বের করা হয় যার জন্য তারা অনুকূলিত হয়েছিল।

অজানা প্রাথমিক অনুমান

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

প্রায়শই ধারণার কোডটি পাওয়ার চেয়ে ধারণাটি শেখা আরও উপকারী।

আপনি এটি গোপন করতে পারবেন না

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

ভবিষ্যতের সময় ব্যয়

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

উপসংহার:

আমার ব্যক্তিগত অভিজ্ঞতা থেকে, তৃতীয় পক্ষের ইউআই কোডের বেশিরভাগ ব্যবহার কিছুটা সময় অর্জনের জন্য ছোট নমনীয়তার বিনিময় করতে সিদ্ধ হয়।

আমরা আমাদের বর্তমান রিলিজটি দ্রুত চালাতে রেডিমেড কোড ব্যবহার করি। যত তাড়াতাড়ি বা পরে, আমরা গ্রন্থাগারের সীমাতে আঘাত করি এবং একটি কঠিন সিদ্ধান্তের সামনে দাঁড়ান: এর পরে কী করা উচিত?


0

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

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

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