আমি আমার সাইটে ব্যবহারের জন্য একটি সাফল্য সিস্টেম ডিজাইনের সেরা পন্থার কথা ভাবছি। 3 বা ততোধিক ধারাবাহিক রেকর্ড অনুপস্থিত বলার সেরা উপায়ে ডাটাবেস কাঠামোটি পাওয়া যাবে এবং এই থ্রেডটি বিকাশকারীদের কাছ থেকে ধারণা পেতে সত্যই একটি এক্সটেনশন।
এই ওয়েবসাইটে ব্যাজ / কৃতিত্ব সিস্টেমগুলি সম্পর্কে আমার প্রচুর আলাপের সাথে যে সমস্যাটি রয়েছে তা হ'ল - এটি সমস্ত আলাপ এবং কোনও কোড নেই। প্রকৃত কোড প্রয়োগের উদাহরণগুলি কোথায়?
আমি এখানে এমন একটি নকশার প্রস্তাব দিচ্ছি যা আমি আশা করি যে লোকেরা অবদান রাখতে পারে এবং আশা করি এক্সটেনসিবল কৃতিত্ব সিস্টেমগুলিকে কোডিংয়ের জন্য একটি ভাল নকশা তৈরি করতে পারে। আমি বলছি না এটি সেরা, এটি থেকে অনেক দূরে, তবে এটি একটি সম্ভাব্য সূচনা ব্লক।
আপনার ধারণা অবদান নির্দ্বিধায় দয়া করে।
আমার সিস্টেম ডিজাইন ধারণা
মনে হচ্ছে সাধারণ sensক্যমত্যটি "ইভেন্ট ভিত্তিক সিস্টেম" তৈরি করা - যখনই কোনও পোস্ট তৈরি হওয়ার পরে মুছে ফেলার মতো কোনও ইভেন্ট ঘটে তখন তা ইভেন্ট শ্রেণিকে কল করে ..
$event->trigger('POST_CREATED', array('id' => 8));
ইভেন্ট শ্রেণিটির পরে এই ইভেন্টটির জন্য "শ্রবণ" কি ব্যাজগুলি তা খুঁজে বের requires
করে এবং এটি সেই ফাইলটি করে এবং সেই শ্রেণীর উদাহরণ তৈরি করে, যেমন:
require '/badges/' . $file;
$badge = new $class;
এরপরে এটি যখন trigger
ডাকা হত তখন প্রাপ্ত ডেটা পাস করে ডিফল্ট ইভেন্টকে ;
$badge->default_event($data);
ব্যাজ
আসল যাদুটি তখনই ঘটে। একটি ব্যাজ দেওয়া উচিত কিনা তা নির্ধারণ করার জন্য প্রতিটি ব্যাজের নিজস্ব প্রশ্ন / যুক্তি রয়েছে। প্রতিটি ব্যাজ যেমন এই ফর্ম্যাটটি সেট করা আছে:
class Badge_Name extends Badge
{
const _BADGE_500 = 'POST_500';
const _BADGE_300 = 'POST_300';
const _BADGE_100 = 'POST_100';
function get_user_post_count()
{
$escaped_user_id = mysql_real_escape_string($this->user_id);
$r = mysql_query("SELECT COUNT(*) FROM posts
WHERE userid='$escaped_user_id'");
if ($row = mysql_fetch_row($r))
{
return $row[0];
}
return 0;
}
function default_event($data)
{
$post_count = $this->get_user_post_count();
$this->try_award($post_count);
}
function try_award($post_count)
{
if ($post_count > 500)
{
$this->award(self::_BADGE_500);
}
else if ($post_count > 300)
{
$this->award(self::_BADGE_300);
}
else if ($post_count > 100)
{
$this->award(self::_BADGE_100);
}
}
}
award
ফাংশনটি একটি বর্ধিত শ্রেণি থেকে আসে Badge
যা ব্যবহারকারীরা ইতিমধ্যে ব্যাজটি ডিজে টেবিল আপডেট করবে কিনা তা ইতিমধ্যে ব্যাজটি পুরষ্কার পেয়েছে কিনা তা পরীক্ষা করে দেখুন। ব্যাজ শ্রেণিটি ব্যবহারকারীর জন্য সমস্ত ব্যাজ পুনরুদ্ধার এবং এ্যারে এনে ফিরিয়ে দেওয়ার ক্ষেত্রেও যত্ন নেয় (যাতে ব্যাজগুলি উদাহরণস্বরূপ ব্যবহারকারীর প্রোফাইলে প্রদর্শিত হতে পারে)
ইতিমধ্যে যখন কোনও লাইভ সাইটে সিস্টেমটি প্রথম প্রথম প্রয়োগ করা হয় তখন কী হবে?
এখানে একটি "ক্রোন" জব ক্যোয়ারী রয়েছে যা প্রতিটি ব্যাজে যুক্ত হতে পারে। এর কারণ হ'ল কারণ যখন ব্যাজ সিস্টেমটি খুব প্রথম প্রয়োগ করা হয় এবং শুরু করা হয়, ইতিমধ্যে যে ব্যাজগুলি আয় করা উচিত ছিল এখনও পুরষ্কার দেওয়া হয়নি কারণ এটি একটি ইভেন্ট ভিত্তিক সিস্টেম। সুতরাং প্রতিটি ব্যাজ যা প্রয়োজন তা পুরষ্কারের দাবিতে একটি CRON কাজ চালিত হয়। উদাহরণস্বরূপ উপরের জন্য সিআরএন কাজটি দেখতে দেখতে পাবেন:
class Badge_Name_Cron extends Badge_Name
{
function cron_job()
{
$r = mysql_query('SELECT COUNT(*) as post_count, user_id FROM posts');
while ($obj = mysql_fetch_object($r))
{
$this->user_id = $obj->user_id; //make sure we're operating on the right user
$this->try_award($obj->post_count);
}
}
}
উপরের ক্রোন শ্রেণিটি প্রধান ব্যাজ শ্রেণিকে প্রসারিত করায় এটি যুক্তি ফাংশনটি পুনরায় ব্যবহার করতে পারে try_award
আমি এর জন্য বিশেষায়িত ক্যোয়ারী তৈরি করার কারণটি হ'ল যদিও আমরা পূর্ববর্তী ইভেন্টগুলিকে "অনুকরণ" করতে পারি, অর্থাত্ প্রতিটি ব্যবহারকারীর পোস্টের মধ্য দিয়ে যেতে পারি এবং ইভেন্ট শ্রেণিটিকে ট্রিগার করতে পছন্দ $event->trigger()
করি যেমন বিশেষ ধীরে ধীরে অনেক ব্যাজগুলির জন্য খুব ধীর হয়। সুতরাং আমরা পরিবর্তে একটি অনুকূলিত ক্যোয়ারী তৈরি করি।
কোন ব্যবহারকারী পুরষ্কার পায়? অন্যান্য পুরষ্কার প্রদান সম্পর্কেইভেন্টের ভিত্তিতে ব্যবহারকারীদের
Badge
বর্গ award
ফাংশন উপর কাজ করে user_id
- তারা সবসময় পুরস্কার দেওয়া হবে। ডিফল্টরূপে ব্যাজটি সেই ব্যক্তিকে দেওয়া হয় যিনি ইভেন্টটি ঘটানোর কারণ ঘটিয়েছেন যেমন সেশন ব্যবহারকারী আইডি (এটি default_event
ফাংশনের ক্ষেত্রে সত্য , যদিও সিআরএন কাজটি অবশ্যই সমস্ত ব্যবহারকারী এবং পুরষ্কার পৃথক ব্যবহারকারীদের মধ্য দিয়ে যায়)
সুতরাং আসুন একটি উদাহরণ দেওয়া যাক, একটি কোডিং চ্যালেঞ্জ ওয়েবসাইট ব্যবহারকারীরা তাদের কোডিং এন্ট্রি জমা দিন। অ্যাডমিন তারপরে এন্ট্রিগুলি বিচার করে এবং শেষ হয়ে গেলে, সকলের জন্য দেখার জন্য চ্যালেঞ্জ পৃষ্ঠায় ফলাফল পোস্ট করে। এটি যখন ঘটে তখন একটি POSTED_RESULTS ইভেন্ট বলা হয়।
যদি আপনি পোস্ট করা সমস্ত এন্ট্রিগুলির জন্য ব্যাজ পুরষ্কার দিতে চান, তবে তাদের বলুন, যদি তাদের শীর্ষ 5 এর মধ্যে স্থান দেওয়া হয় তবে আপনার ক্রোন জবটি ব্যবহার করা উচিত (যদিও এটি বিবেচনায় না রেখে সমস্ত ব্যবহারকারীর জন্য আপডেট হবে, কেবলমাত্র সেই চ্যালেঞ্জের জন্য নয়) ফলাফল পোস্ট করা হয়েছিল)
আপনি যদি ক্রোন কাজের সাথে আপডেট করার জন্য আরও নির্দিষ্ট ক্ষেত্রকে লক্ষ্য করতে চান, আসুন ক্রোন জব অবজেক্টে ফিল্টারিং পরামিতি যুক্ত করার কোনও উপায় আছে কিনা তা দেখুন এবং সেগুলি ব্যবহার করার জন্য ক্রোন_জব ফাংশন পান। উদাহরণ স্বরূপ:
class Badge_Top5 extends Badge
{
const _BADGE_NAME = 'top5';
function try_award($position)
{
if ($position <= 5)
{
$this->award(self::_BADGE_NAME);
}
}
}
class Badge_Top5_Cron extends Badge_Top5
{
function cron_job($challenge_id = 0)
{
$where = '';
if ($challenge_id)
{
$escaped_challenge_id = mysql_real_escape_string($challenge_id);
$where = "WHERE challenge_id = '$escaped_challenge_id'";
}
$r = mysql_query("SELECT position, user_id
FROM challenge_entries
$where");
while ($obj = mysql_fetch_object($r))
{
$this->user_id = $obj->user_id; //award the correct user!
$this->try_award($obj->position);
}
}
প্যারামিটার সরবরাহ না করা হলেও ক্রোন ফাংশনটি এখনও কাজ করবে।