PDA

View Full Version : روش جدید IMBH برای سازماندهی کد



eshpilen
چهارشنبه 03 اسفند 1390, 11:50 صبح
این روش یحتمل به تازگی اختراع شده و سرنام این عبارته: Include Many Be Happy
نام مخترع: پروفسور eshpilen

گذشته از شوخی این روش اگر نبود واقعا نمیدونستم بخاطر حجم و پیچیدگی کد چکار کنم. دمار از روزگارم و چش و چالم داشت درمیامد. واسه همین تصمیم گرفتم هر بخش منطقی و قطعه کد مربوط از سیستم رو در یک فایل مجزا بذارم و در فایلهای دیگه و صفحات اصلی صرفا اینکلود کنم. طبیعتا یک مزیت دیگر این کار، متمرکز بودن و امکان ویرایش سریع و راحت و کلی اجزای مختلف برنامه هست که در سراسر پروژه ممکنه یک قطعه کدی بارها بکار رفته باشه.

گفتم حالا که پروژم معلوم نیست چقدر طول بکشه چون فقط روزهای تعطیل و آخر هفته ها اکثرا اگر وقتی گیر بیارم روش کار میکنم، بنابراین پیشاپیش اینطور روشهای مهم مورد استفادهء خودم رو مطرح کنم تا در این حین تحلیل و نظر دیگران رو دربارش کم و بیش بدونیم.

این مثلا تمام کد صفحهء setup_db.php بنده هست:

<?php
if(ini_get('register_globals')) exit("<center><h3>Error: Turn that damned register globals off!</h3></center>");
$parent_page=true;

$include_request=array('');//includes common.php
include $_SERVER['DOCUMENT_ROOT'].'/includer.php';

$include_request=array('', 'code_encoding8anticache_headers.php'=>'code');
include $_SERVER['DOCUMENT_ROOT'].'/includer.php';

$include_request=array('', 'code_prevent_repost.php'=>'code');
include $_SERVER['DOCUMENT_ROOT'].'/includer.php';

$include_request=array('', 'code_sess_start.php'=>'code');
include $_SERVER['DOCUMENT_ROOT'].'/includer.php';

$include_request=array('', 'func_random.php'=>'func');
include $_SERVER['DOCUMENT_ROOT'].'/includer.php';

$file_contents=file_get_contents('setup.txt');

if(!isset($_SESSION['setup_key']) or strpos($file_contents, $_SESSION['setup_key'])===false) {
$setup_key=random_string('ABCDEFGHIJKLMNOPQRSTUVWX YZabcdefghijklmnopqrstuvwxyz0123456789', 22);
$_SESSION['setup_key']=$setup_key;
$include_request=array('', 'page_setup1.php'=>'page');
include $_SERVER['DOCUMENT_ROOT'].'/includer.php';
exit;
}

$include_request=array('', 'code_db_object.php'=>'code');
include $_SERVER['DOCUMENT_ROOT'].'/includer.php';

$include_request=array('', 'info_register_fields.php'=>'info');
include $_SERVER['DOCUMENT_ROOT'].'/includer.php';

do {
if(!isset($_POST['username'])) break;
$include_request=array('', 'code_validate_admin_register_submit.php'=>'code');
include $_SERVER['DOCUMENT_ROOT'].'/includer.php';
if(isset($err_msgs)) break;
echo '<html><head><meta http-equiv="Content-type" content="text/html;charset=UTF-8" /><META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE"><META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE"><META HTTP-EQUIV="EXPIRES" CONTENT="0"><title>Setup db - final</title></head><body bgcolor="#D1D1E9" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000"><table align="center" valign="center" height="100%"><tr><td><h4>';
$include_request=array('', 'code_create_tables.php'=>'code');
include $_SERVER['DOCUMENT_ROOT'].'/includer.php';
$include_request=array('', 'code_add_admin_account.php'=>'code');
include $_SERVER['DOCUMENT_ROOT'].'/includer.php';
echo 'Account <span style="color: green">Admin</span> created.<br>';
echo '</h4><center><h3>Congratulations!<br>Setup completed.</h3>';
echo "<a href=\"";
if(!$project_root) echo '/';
echo "$project_root\" />Login page</a></center>";
$include_request=array('', 'code_sess_destroy.php'=>'code');
include $_SERVER['DOCUMENT_ROOT'].'/includer.php';
$include_request=array('', 'code_set_submitted_forms_cookie.php'=>'code');
include $_SERVER['DOCUMENT_ROOT'].'/includer.php';
echo '</td></tr></table></body></html>';
exit;
} while(false);

$include_request=array('', 'page_setup2.php'=>'page');
include $_SERVER['DOCUMENT_ROOT'].'/includer.php';

?>

همین چند خط کد کلی کار میکنه، چون تقریبا تمام کدهای عملیاتی در فایلهای جداگانه هستن که در این صفحه فقط اینکلود میشن.
کارهایی که میکنه:
- اول یک رشتهء رندوم ایجاد میکنه که باید کاربر در فایل خاصی ذخیره کنه تا ثابت بشه مالک واقعی هاست است. بعد توسط سشن این کاربر اون رو برای انجام بقیهء عملیات احراز هویت میکنیم.
- کاربر بعد از ذخیرهء رشتهء رندوم در فایل setup.txt و کلیک روی دکمهء Continue به فرمی میره که باید پسورد و ایمیل ادمین رو درش وارد کنه تا اکانت ادمین سیستم پس از ایجاد جداول سیستم ایجاد بشه.
- ورودی های اطلاعات ادمین در سمت سرور چک میشن (در سمت کلاینت هم که طبیعتا validate خودش رو داره) و اگر خطایی بود دوباره به فرم اطلاعات ادمین برمیگرده با پیامهای خطای مربوطه.
- بعد از بررسی بدون مشکل بودن اطلاعات ورودی برای ادمین، برنامه دستور ایجاد جدولها رو از فایلهای با پسورد sql که با phpMyAdmin ایجاد شدن میخونه و اجرا میکنه که نتیجتا تمام جداول پروژه ایجاد میشن. لازم به ذکر است که کاربر باید قبلا اطلاعات اتصال به دیتابیس رو در فایل کانفیگ برنامه وارد و سیو کرده باشه و همچنین دیتابیس باید از قبل توسط کاربر ایجاد شده باشه (چون روی شیرهاست ها نمیشه با خود PHP دیتابیس رو ایجاد کرد).
- بعد از ایجاد جداول، برنامه اکانت ادمین رو با پسورد و ایمیل مشخص شده توسط کاربر به جدول accounts اضافه میکنه. این اکانت در پروژهء بنده کاربردش فقط برای تایید یا حذف اکانتهای معلق هست که برای ثبت نهایی نیاز به تایید ادمین دارن. البته شاید بعدا یک سیستم Ban هم به پروژه اضافه کردم که در اینصورت این کار هم با استفاده از اکانت ادمین انجام خواهد شد.
- در مرحلهء آخر هم که تبریکات و اینا!! ضمنا اگر کاربر بعد از این مرحله صفحه رو رفرش کنه برنامه ارسال تکراری فرم رو تشخیص میده و میگه که این درخواست قبلا پردازش شده.

همونطور که میبینید، فقط یکسری کدهای HTML کوتاه رو در این صفحه با بقیهء کدها قاطی کردم چون حجمشون خیلی کم بود و ذخیرهء اونها در یک فایل جداگانه بنظرم زیاد مهم نبود.

از اسم فایلهای اینکلود شده شاید خیلی چیزها مشخص باشه.
اما داستان اون آرایهء include_request و includer.php چیه حالا زیاد مهم نیست و یه سیستمی بود که از نسخهء قدیمی پروژه باقی مونده بود و منم چون هم کار رو راحت میکرد و هم وقت نداشتم، دیگه تغییر زیادی درش ندادم.
برای روشن شدن موضوع بگم که مثلا این رو:

$include_request=array('', 'code_prevent_repost.php'=>'code');
include $_SERVER['DOCUMENT_ROOT'].'/includer.php';
میتونیم معادل این فرض کنیم:

include 'include/code/code_prevent_repost.php'
از نظر عمل نهایی فرق مهمی با هم ندارن.
شاید هم بعدا کلا این سیستم رو برداشتم و با اینکلودهای ساده جایگزین کردم که در این صورت هم کد بازهم کوتاهتر میشه و هم پرفورمنس مقداری بالاتر میره.

پس با استفاده از تفکیک و تقسیم کدها در فایلهای مجزا میبینیم که حجم کد ما چقدر کم و چقدر خواناتر و مدیریتش راحتتر میشه. به این شکل منطق و الگوریتم سطح بالا در فایل اصلی دیده و مدیریت میشه و شما کدهای اضافه ای در ارتباط با منطق و الگوریتم و لایه های سطح پایینتر در فایلهای اصلی مشاهده نمیکنید (یا درواقع در یک حداقل ممکن مشاهده میکنید)، و هر بخش از منطق و الگوریتم های سطح پایینتر در فایلهای اینکلود شونده (که بعضی از اونا هم ممکنه خودشون سطح داشته باشن و فایلها و قطعه کدهای دیگری رو حالا کم یا زیاد اینکلود کنن) توزیع شده و مدیریت میشن.

ضمنا اینکه گفتم این روش رو اختراع کردم بیشتر شوخی بود. چون توزیع کدها در فایلهای مجزا که اصلا چیز جدید و پیچیده ای نیست و از دوران باستان شناخته شده و در تمام زبانهای برنامه نویسی مورد استفاده بوده؛ منتها من فکر میکنم یک حالت گسترده و کم و بیش خاصی از این روش رو استفاده کردم که تاحالا درکدهای دیگری مشاهده نکردم (البته کد برنامه های زیادی رو هم بررسی نکردم که بخوام مطمئن باشم).