معرفی روش های ساخت برنامه اندروید به صورت ((محتوا محور))، (جدا کردن محتوای اطلاعاتی برنامه اندروید و گرافیک آن) و بررسی معایب و مزیت های آنها
این مبحث، یکی از مهمترین مبحث هایی است که یک برنامه نویس باید به آن توجه کند. زیرا مفهومی که در آن شرح داده می شود، می تواند مسیر حرفه ای و کاری برنامه نویس را به شدت تحت تاثیر قرار بدهد. هر برنامه نویس باید به شیوه کدنویسی خود دقت کند، زیرا اگر شیوه غلطی را در پیش بگیرید، وقتی حجم کارهایش زیاد شود و قصد توسعه برنامه های خود را داشته باشد، ممکن است با مشکل های اساسی برخورد کند. بحث جداسازی محتوای اطلاعاتی از قالب (گرافیک، ساختار و کدهای قالب)، بحثی رایج در تمامی زبان های برنامه نویسی می باشد، بنابراین من سعی می کنم که این مفهوم را هم برای برنامه نویسی اندروید و هم برای برنامه نویسی و طراحی وب سایت شرح بدهم زیرا می دانم که تعداد زیادی از برنامه نویس های اندروید، در زمینه طراحی وب سایت نیز فعالیت می کنند.
جدا کردن محتوای برنامه و کدهای قالب برنامه، به چه معنی است و اصلا کدام برنامه ها به آن نیاز دارند ؟
ابتدا بگذارید شرح بدهم که اصلا چرا باید محتوای برنامه اندروید را از قالب آن (کدها، گرافیک و ...) جدا کنیم. من تجربه برنامه نویسی خودم برای سایت کلیدستان را شرح می دهم. هنگامی که کدنویسی برای سایت کلیدستان را شروع کردم، محتویات مورد نظرم برای هر مبحث را در صفحه مربوط به آن قرار می دادم، با بزرگتر شدن سایت و هنگامی که تصمیم جدی گرفتم که سایت را توسعه بدهم، دیگر روش قبلی جوابگو نبود زیرا ساختن تعدادی صفحه برای مباحث جدید، کاملا غیر حرفه ای بود. من به دنبال راه حلی بودم که بدون ساخت صفحات جدید که مجبور باشم بر روی سایت قرار بدهم، بتوانم مباحث جدید را به سایت اضافه کنیم. راه حل برای مشکل من، یادگیری زبان PHP و سپس استفاده از پایگاه داده MySQL بود. بنابراین برای ویرایش تعدادی مبحث و یا عنوان های آنها، دیگر مجبور نبودم تعدادی فایل را باز کنم، بلکه خیلی راحت از یک برنامه گرافیکی کار با پایگاه داده MySQL استفاده می کردم که در آن می توانستم به راحتی، تعدادی مبحث و اطلاعات مربوط به آنها را تغییر بدهم (و یا تعدادی مبحث اضافه کنم). همچنین پایگاه داده دارای قابلیت جستجو در مباحث بود که کمک بزرگی برای یافتن مباحث می باشد. بنابراین آن چیزی که به صورت فایل در سایت وجود دارد، کدهایی برای نمایش محتویات اطلاعاتی ذخیره شده در پایگاه داده (database) می باشد (نه خود محتویات اطلاعاتی). چون دیگر محتویات اطلاعاتی در میان کدها وجود ندارد، بنابراین تغییر کدها، بسیار ساده تر خواهد بود و دیگر محتوا مزاحمتی ایجاد نمی کند.
فرض کنید من به یکباره تصمیم بگیرم که قالب جدیدی را برای سایت کلیدستان به کار ببرم. مسلما آن چیزی که به سایت کلیدستان، هویت می بخشد، همان محتوای مبحث ها می باشد، زیرا سایت کلیدستان، یک سایت بر اساس محتوای اطلاعاتی می باشد و بدون محتوای خود، هیچگونه ارزشی ندارد (و قالب سایت، تنها شیوه ای سلیقه ای برای نمایش محتویات سایت می باشد). خوب فرض کنید که من محتویات را در صفحاتی قرار داده باشم که در میان کدهای قالب باشد، اگر اینگونه باشد، بیرون آوردن محتوا از میان صفحات سایت و سپس قرار دادن آنها در قالب جدید، بسیار دشوار خواهد بود. اما چنانچه محتویات در پایگاه داده (database) ذخیره شده باشد، دیگر کاری با قالب قبلی ندارم و خیلی راحت، در قالب جدید، کدهایی را برای دریافت اطلاعات از پایگاه داده و نمایش آنها در قالب را می نویسم (به همین سادگی).
فرض کنید فردی بخواهد سایتی با 10 صفحه طراحی کند که برای معرفی یک شرکت است و البته قصد هم ندارد که سایت را توسعه بدهد. مسلما چنین کسی نیاز ندارد که درگیر کدنویسی برای محتوا محور کردن سایت بشود. همینکه 10 صفحه را طراحی کند، کافی است.
همچنین برخی از کاربردها، ذاتا محتوا محور هستند. مثلا کسی که یک برنامه دیکشنری می سازد، حتما باید از روش های مربوط به ذخیره حجم زیادی اطلاعات استفاده کند زیرا قرار دادن تعداد 20000 یا 30000 کلمه انگلیسی و معنای آن در میان قالب برنامه، غیر ممکن است.
روش های ممکن برای محتوا محور کردن برنامه اندروید :
در ادامه، روش های ممکن (روش های که بنده می شناسم) برای جدا کردن محتویات اطلاعاتی برنامه از قالب برنامه (کدها، گرافیک و ...) را شرح می دهم. توصیه می کنم که ابتدا همه را بخوانید و بعد مناسبترین را برای خود انتخاب کنید.
انتخاب روش، بستگی به نوع اطلاعات برنامه و همچنین، تجربه های قبلی کدنویسی شما دارد. همچنین، امکان ترکیب روش ها نیز وجود دارد.
روش اول : استفاده از پایگاه داده SQLite
پایگاه داده (database)، حرفه ای ترین انتخاب برای ذخیره اطلاعات می باشد. پایگاه داده ای که در برنامه نویسی اندروید از آن استفاده می شود، پایگاه داده SQLite می باشد. پایگاه داده SQLite ، نسبت به پایگاه های داده ای که در طراحی وب سایت به کار می رود، ساده تر می باشد و همچنین، دارای امنیت پایینی است زیرا به همراه برنامه اندروید، در اختیار کاربر قرار می گیرد (مثل پایگاه داده MySQL نیست که در طراحی وب سایت به کار می رود و در سمت سرور قرار دارد و کاربر به آن دسترسی مستقیم ندارد).
امکان تبدیل پایگاه داده SQLite به پایگاه داده MySQL وجود دارد و همچنین معکوس این تبدیل نیز امکان پذیر می باشد (تعدادی نرم افزار رایگان و یا پولی در این زمینه وجود دارد). بنابراین، اگر قبلا اطلاعاتی را در پایگاه داده سایت خود ذخیره کرده اید (با پایگاه داده MySQL یا انواع دیگری از پایگاه داده)، می توانید آن اطلاعات را در پایگاه داده SQLite ذخیره کنید و بعد آن را، در برنامه اندروید خود، برای نمایش اطلاعات به کار ببرید. همچنین اگر اطلاعات خود را در پایگاه داده SQLite قرار بدهید، در آینده، هر زمان که تصمیم بگیرید، می توانید آن را به پایگاه داده MySQL یا انواع دیگری از پایگاه داده، تبدیل کنید و از آن اطلاعات، در سایت خود استفاده کنید. این ویژگی قابل استفاده بودن اطلاعات، هم در برنامه اندروید و هم در وب سایت (البته با تبدیل پایگاه های داده به هم)، مزیت بسیار بزرگی است.
مثلا برای قرآن کریم، پایگاه داده MySQL آماده ای در سایت ها وجود دارد (سایت هایی، فایل آن را برای دانلود، در دسترس کاربران قرار داده اند) که حاوی اطلاعات مربوط به تمامی سوره ها و آیه های قرآن کریم می باشد، اگر شما قصد دارید که یک برنامه اندروید بسازید که برای نمایش قرآن به کار می رود، دیگر نیازی به نوشتن آیه ها در یک پایگاه داده SQLite نیست. شما خیلی راحت می توانید آن پایگاه داده MySQL را از سایت ها دانلود کرده و به پایگاه داده SQLite تبدیل کنید و سپس از آن، در برنامه اندروید خود، استفاده نمایید. در واقع، تنها باید کدهایی برای خواندن اطلاعات مربوط به آیه ها و سوره ها از پایگاه داده SQLite و چگونگی نمایش آنها را در برنامه اندروید بنویسید.
روش دوم : استفاده از فایل های HTML برای محتویات اطلاعاتی (ترکیب متن و عکس) و فایل strings.xml برای عنوان ها (متن)
ما می توانیم فایل های HTML را در پوشه assets از پروژه اندروید، قرار بدهیم. بنابراین اگر شما قبلا اطلاعات خود را به صورت فایل HTML (فایل مربوط به نمایش صفحات اینترنتی) داشته باشید، آنگاه می توانید آن را در پوشه assets از پروژه اندروید قرار بدهید و سپس با استفاده از WebView ، محتویات آن صفحه HTML را در یک Activity از برنامه اندروید، به کاربر نمایش بدهید.
عنوان های مربوط به هر فایل HTML (هر مبحث) را در فایل strings.xml ذخیره می کنیم. زیرا ابتدا باید در یک Activity ، یک ListView را به کاربر نمایش بدهیم که حاوی عنوان مباحث می باشد (عنوان ها را از فایل strings.xml دریافت کرده و نمایش می دهد)، سپس کاربر مثلا اگر بر روی item شماره 10 از ListView اشاره کند، آنگاه شماره item را به Activity حاوی عنصر WebView می فرستیم و در آن Activity ، فایل HTML که دارای شماره 10 است (اسم فایل ها را شماره دار می نویسیم یا پسوندی شماره دار برای آنها قرار می دهیم) را در WebView نمایش می دهد.
این روش، روش مورد علاقه من است. زیرا محتویات سایت کلیدستان به صورت کد HTML می باشند و مثلا وقتی می خواستم که برنامه اندروید آموزش برنامه نویسی MATLAB را بسازم، خیلی راحت، کدها را در تعدادی فایل HTML کپی کردم (البته به دلیل نوع خاص آن اطلاعات، آنها را به عکس نبدیل کردم) و با کمی کدنویسی PHP ، عنوان ها را از پایگاه داده خواندم و به صورت قاعده مند، در فایل strings.xml قرار دادم (عنوان رشته ها را با یک پسوند عددی انتخاب کردم تا ارجاع به آنها، متناسب با شماره مباحث باشد). دقت شود که وقتی می گویم استفاده از کدنویسی PHP ، منظورم این است که دیگر نیازی به copy و paste کردن تک تک عنوان ها نبوده است و تنها با ساخت یک حلقه for و استفاده از الگوی تعریف رشته ها در فایل strings.xml ، تعدادی رشته را در خروجی تولید کردم و سپس آنها را در فایل strings.xml کپی کردم.
خوبی استفاده از فایل های HTML این است که امکان قرار گرفتن عکس و متن در کنار هم را به ما می دهد. علاوه بر این، اگر با مفهوم برنامه نویسی CSS آشنا باشید، می دانید که در تمامی فایل های HTML می توانیم به یک فایل CSS ارجاع بدهیم و بعد با تغییر کدهای آن فایل CSS ، به طور همزمان، ویژگی های محتویات تمامی آن فایل های HTML را تغییر بدهیم (بدون اینکه مجبور باشیم تک تک آنها را باز کرده و ویرایش کنیم).
روش سوم : استفاده از فایل های حاوی متن در پوشه assets (با هر نوع پسوند دلخواه)
برنامه نویسان، گاهی اطلاعات خود را در فایل متنی (با هر پسوند دلخواه، مثل txt) ذخیره می کنند. سپس در هنگام کدنویسی، نوع خواندن اطلاعات از فایل متنی را می نویسند. واقعیت این است که این روش، کمی دردسر دارد زیرا نیاز به مقداری کدنویسی دارد که مربوط به کار با رشته ها و ... می باشد، اما باید به این نکته توجه داشت که گاهی اطلاعاتی در اختیار ما قرار می گیرد که در یک فایل متنی موجود است و دارای ساختاری خاص است و برای خواندن آن اطلاعات، مجبوریم که مقداری کدنویسی کنیم. مثلا کد زیر را ببینید :
variable_1 variable_2 variable_3
26 12 48
2 15 96
8 85 42
57 69 3
19 54 47
فرض کنید که اعداد موجو در فایل، در تعداد 10000 ردیف از فایل، وجود داشته باشند و همان طور که مشاهده می کنید، دو خط اول، حاوی مقداری توضیح است. برای این مورد خاص، باید کد بنویسیم که دو خط اول فایل در نظر گرفته نشود و سپس از خط سوم فایل، بر اساس ساختار (که بین هر دو عدد، یک فاصله تکی وجود دارد)، اعداد را بخوانیم.
شاید بگویید که مگر اینگونه شیوه ها هم برای ذخیره اطلاعات به کار می رود، باید پاسخ بدهم که بله و اتفاقا بسیار رایج می باشد، مثلا تعدادی از محققین، فایل های حاوی اطلاعات آزمایشگاهی را به این صورت ذخیره کرده و در اختیار سایر افراد قرار می دهند.
روش چهارم : دریافت اطلاعات از سرور اینترنتی، به صورت متن ساده
قبلا در مباحثی دیگر، روش های HttpPost و HttpGet می توانید که از سرور اینترنتی، اطلاعاتی را به صورت متن دریافت کنید. بنابراین می توانید اطلاعات مورد نظر خود را در پایگاه داده (database) موجود در سرور اینترنتی (مثلا پایگاه داده MySQL ذخیره کنید و سپس در برنامه اندروید، به آدرس اینترنتی مورد نظرتان ارجاع داده و اطلاعات را دریافت کنید.
مزیت این روش این است که پایگاه داده (database) در سمت سرور است و بنابراین کاربر، دسترسی مستقیم به آن ندارد (همان طور که قبلا گفتیم، پایگاه داده SQLite ، به همراه برنامه اندروید، در اختیار کاربر قرار داده می شود و بنابراین دارای امنیت پایینی است).
روش پنجم : دریافت اطلاعات از سرور اینترنتی، به صورت روش json
همان طور که گفتیم، روش های HttpPost و HttpGet برای دریافت متن از سرور اینترنتی به کار می روند. اگر متن مورد نظرمان در سمت سرور را به صورت json تولید کنیم، آنگاه یک متن ساختار یافته به صورت json داریم و هنگام کدنویسی اندروید، کلاس هایی (class) برای پردازش متن به صورت json وجود دارد و خیلی راحت، اطلاعات را از متن خارج می کنیم و در آرایه هایی قرار می دهیم. این روش، به استفاده تنها HttpPost و HttpGet ، برتری دارید زیرا دیگر نیازی به کدنویسی برای پردازش متن دریافتی نداریم.
بیشتر برنامه های آنلاین، از روش json استفاده می کند، زیرا این روش، در میزان تبادل اطلاعات میان برنامه اندروید و اینترنت نیز صرفه جویی می کنند (علامت های به کار رفته در ساختار json ، بسیار ساده و کم حجم هستند و بیشتر کاراکترهای متن، همان اطلاعات اصلی خواهند بود).
روش ششم : دریافت اطلاعات از سرور اینترنتی، به صورت روش XML
کاربرد این روش، همانند روش json است و تنها تفاوت این است که نماد های به کار رفته در متن با ساختار XML ، بسیار بیشتر از json هستند و بنابراین باعث می شود که حجم اطلاعات تبادل شده بین برنامه اندروید و سرور اینترنتی زیاد شود که مطلوب نیست. بنابراین روش json ، از روش XML برتر است.
روش هفتم : تعریف اطلاعات در یک کلاس (class)
یکی از روش هایی که من به کار می برم، این است که برخی اطلاعات کلی برنامه اندروید را که می دانم در اکثر Activity های برنامه، مورد استفاده قرار می گیرد را در یک کلاس (class) تعریف می کنم و سپس در Activity های مختلف، یک شیء (object) از آن کلاس می سازم و مقادیر مورد نظر را فراخوانی می کنم. بنابراین، اطلاعات کلی برنامه (مثلا تعداد مباحث) تنها در یک کلاس (class) از برنامه اندروید تعریف شده است و هنگامی که بخواهیم آن مقادیر را تغییر بدهیم، تنها باید کدهای همان کلاس را ویرایش کنیم.
در کل مراقب باشید که وقتی قرار است یک مقدار خاص را در چند Activity به کار ببرید، آن را به صورت دستی در کدهای Activity ننویسید زیرا اگر بعدا بخواهید آن را تغییر بدهید، فراموش خواهید کرد که اصلا آن را در کدام Activity ها به کار برده اید. بنابراین، استفاده از این روش، تمامی استرس های ناشی از اینگونه سردرگمی ها را از بین می برد.