ক্লায়েন্ট-সাইড এবং সার্ভার-সাইড বৈধতা এক জায়গায় পরিচালনা করা


17

আমি বোর্ডে 100% এমন কেস নিয়ে আসছি যাতে অবশ্যই ক্লায়েন্ট-সাইড এবং সার্ভার-সাইড ডেটা বৈধতা উভয়ই ব্যবহার করা উচিত

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

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

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

এটি আমাকে প্রশ্নে নিয়ে আসে: আপনি কীভাবে ডেটা যাচাইয়ের জন্য "একবার লেখুন, সার্ভার এবং ক্লায়েন্ট চালান" কৌশলটি ডিজাইন করবেন?

সম্পর্কিত সাবটোপিক্স: এর মতো সরঞ্জামগুলি কি কোনও নির্দিষ্ট ফ্রেমওয়ার্ক বা ক্লায়েন্ট-সার্ভার প্রযুক্তির জন্য বিদ্যমান? কেবলমাত্র এক সেট বৈধতা বজায় রাখার চেষ্টা করার সাথে বড় গোগাচা বা চ্যালেঞ্জগুলি কী কী?

উত্তর:


6

আমার সীমিত অভিজ্ঞতায়, পয়েন্টগুলি যেখানে বৈধতা প্রয়োজন are

  1. এইচটিএমএল ব্যবহার করে উপস্থাপনা স্তর,
  2. উপস্থাপনা-পরবর্তী স্তরে (যেমন, জাভাস্ক্রিপ্টের বৈধতা),
  3. সম্মিলন স্তরে যেখানে একাধিক ক্ষেত্রের মধ্যে মিথস্ক্রিয়াগুলি একত্রে বৈধ করতে হবে,
  4. ব্যবসায় যুক্তি স্তরে এবং
  5. ডাটাবেস স্তরে

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

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


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

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

5

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

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

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

আসুন এই ত্রুটিগুলি কাটিয়ে উঠতে আমাদের সমাধানটি আবার ঘুরে দেখি। পরিবর্তে আসুন মেটাডেটা হিসাবে আমাদের বৈধতা সংরক্ষণ এবং যোগাযোগ:

{field: 'username', type: 'required'}
{field: 'username', type: 'unique'} //requires a network roundtrip
{field: 'password', type: 'length', min: 10, max: 50}
{field: 'password', type: 'contains', characters: ['upper', 'special', 'letter', 'number']}

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


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

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

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

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

1
এই জাতীয় বৈধতা অত্যন্ত কার্যকর হবে। এটি ইউআই নিবিড় ওয়েব অ্যাপ্লিকেশনগুলির সাথে জড়িত কোডের এক তৃতীয়াংশ প্রতিস্থাপন করতে পারে।
ববডালগাইশ

2

একটি উপায় হ'ল সার্ভার এবং ক্লায়েন্ট উভয় পক্ষেই একই ভাষা / কাঠামো ব্যবহার করা।

যেমন

নোড.জেএস :: জাভাস্ক্রিপ্টে ক্লায়েন্ট / সার্ভার জিইটি :: জাভায় ক্লায়েন্ট / সার্ভার

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

সম্পাদনা (জুন / ২০১৪): জাভা ৮ এর সাথে জাভা অ্যাপ্লিকেশনগুলিতেও জেএস বৈধকরণ কোডটি একীভূত করা সহজ। জাভা 8 এ একটি নতুন জেএস এক্সিকিউশন ইঞ্জিন রয়েছে যা আরও স্থায়ী (উদাহরণস্বরূপ: এটি ইনভোকডাইনামিক ব্যবহার করে)।


যখন এটি এসকিউএল ডাটাবেসে আসে তখন নিশ্চিত হয় না যে এটি কীভাবে কাজ করবে।
মাইকেল ডুরান্ট

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

@ মিশেল ডুরান্ট, ডাটাবেস বৈধতার জন্য ডিবি বাধা (যেমন বিদেশী কী, অনন্য ইত্যাদি) হিসাবে প্রয়োগ করা হয়। ববডালগাইশ, ১. ব্রাউজার অনুসারে রানটাইম টুইট করে এমন একটি লাইব্রেরি ব্যবহার করে ব্রাউজার / ওএসের সামঞ্জস্যতা হ্রাস করা যেতে পারে (যেমন সেনচা) ২. ব্রাউজারের সমন্বয়যোগ্যতা যথাযথভাবে বৈধতা, সামঞ্জস্যের সমস্যাগুলির মতো কোডের "লজিক্যাল" অংশগুলিকে প্রভাবিত করে না প্রায় ডম / ইউআই রেন্ডারিং।
শমিত ভার্মা

0

আমি ঠিক একই সমস্যা নিয়ে ভাবছিলাম। আমি সিএন এবং জাভাস্ক্রিপ্ট উভয় ক্ষেত্রে একটি বিমূর্ত সিনট্যাক্স ট্রি পেতে এএনটিএলআর ব্যবহার করার কথা ভাবছিলাম। সেখান থেকে আপনি ভাষাতে নির্দিষ্ট করা ক্রিয়াকলাপগুলিকে বৈধতা দেওয়ার জন্য গাছের ওয়াকার ব্যবহার করেন।

সুতরাং আপনি যেখানে পছন্দ করেন সেখানে প্রয়োজনীয় বৈধতার একটি বিবরণ সংরক্ষণ করতে পারেন - সম্ভবত ডাটাবেসে।

এইভাবেই আমি সমস্যার দিকে এগিয়ে যাব।

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