بنیامینم، گرافیست و برنامه نویس
استفاده از XML در جاوا
راستش همه این نوشته بخشی از جستجوهای من است وقتی که تلاش میکردم تنظیمات برنامهای که نوشتم رو به خارج از اون ببرم! نوشتن تنظیمات برنامه خارج از متن کلاسهای جاوا یک بخش از پروژه درس برنامهنویسی پیشرفته من محسوب میشود. در این متن سعی میکنم تا جایی که یادگرفتهام موضوعات زیر را بررسی کنم:
- چرا از XML استفاده کنیم؟
- چطور تنظیمات، دادهها و یا نمایش برنامه را از متن کلاس ها خارج کنیم؟ (hardcode ننویسیم!)
- چطور در جاوا از روی یک فایل XML بخوانیم؟
- چطور در جاوا روی یک فایل XML بنویسم؟
چرا از XML استفاده کنیم؟
احتمالا میدانید که برای خواندن و نوشتن روی فایلها تکنولوژیهای دیگری هم وجود دارد. XML یک زبان نشانه گذاری استاندارد است که تقریبا همه انتظارهای شما برای ذخیره و انتقال دادههایتان را برآورده میکند. اگر مشخصا از جاوا استفاده میکنید و دادههای سادهای برای نگهداری دست دارید احتمالا propeties خواستههای شما را برآورده خواهد کرد اما برای نگهداری دادههای پیچیدهتر بهتر است از چیزی مثل XML استفاده کنید. propertiesها ممکن است برای شما محدودیت به بار بیاورد! مثلا اگر خواستید برنامه را به کاملا به زبان دیگری بازنویسی کنید استفاده از فایلهایی که مخصوص یک زبان خاص هستند منطقی نیست. بهتر است از استانداردی استفاده کنید که کدهایتان «قابل نگهداری» باشند. اگر شک دارید که چرا از XML استفاده کنید این دو لینک بیشتر میتوانند به شما کمک کنند:
Java and XML by Brett McLaughlin
Java properties: .properties files vs xml?
چطور تنظیمات، دادهها و یا نمایش برنامه را از متن کلاس ها خارج کنیم؟ (hardcode ننویسیم!)
تصور کنید یک برنامه نوشتهاید و میخواهید به کاربر اجازه دهید که سایز و یا رنگهای مختلف به کار رفته را به دلخواه خودش تغییر دهد. یکی از روشهای خوب این است که تنظیمات برنامه را در متن کد برنامه ذخیره سازی نکنید. (اگر در متن برنامه تنظیماتی را بنویسید اصطلاحا hardcode نوشتهاید) بیرون بردن تنظیمات برنامه به شما امکانات فراوانی میدهد مثلا شما میتوانید چند فایل تنظیمات داشته باشید و به دلخواه یکی را لود کنید و یا اینکه به سادگی آنها را تغییر دهید بدون اینکه دست به کد برنامه ببرید. مزایا این کار خیلی زیاد است! من هم بعد از استفاده از آن متوجه شدم این روش بسیار ساده و در عین حال کارآمد و تمیز است.
برای اینکه یک فایل مثل تنظیمات را به صورت XML ذخیره کنید از روی آن بخوانید احتیاج به یک کلاس Setting.java دارید که بتوانید از روی XML با همه فیلدهای مورد نیاز یک آبجکت بسازید. مثلا من یکسری داده رو به صورت پابلیک و استاتیک ذخیره کردهام که حالا میخواهم آنها را با XML بنویسم: (توجه کنید که این مقادیر فاینال و استاتیک هستند، کاری که در برنامهنویسی خیلی توصیه نمیشود!)
public static final String TITLE = "Fire Stone"
// Some sizes
public static final int STANDARD_STATES_WIDTH = 753;
public static final int STANDARD_STATES_HEIGHT = 525;
// Some color
public static final Color BUTTON_COLOR_1 = new Color(0xFF9900);
یک فایل XML ایجاد میکنم و سعی میکنم به طریق منطقی و قابل فهمی دادهها را نگه دارم:
<?xml version="1.0" encoding="UTF-8"?>
<setting>
<title>Fire Stone</title>
<window_size>
<width>753</width>
<height>525</height>
</window_size>
<color>
<name>BUTTON_COLOR_1</name>
<tag>0xFF9900</tag>
</color>
</setting>
اینجا میتوانید بیشتر در مورد نوشتن یک فایل XML بخوانید.
چطور در جاوا از روی یک فایل XML بخوانیم؟
فرض کنید در کل میخواهیم یک کلاس ستینگ از روی XML بسازیم از آن در برنامه استفاده کنیم. قبل از همه چیز باید همین کلاس Setting.java را بسازیم:
کلاس ستینگ ما آماده است. حالا یک کلاس احتیاج داریم که تنها کارش خواندن XML و ساختن یک موجودیت از آن است. این کلاس را SettingLoader.java نامگذاری میکنیم. برای خواندن از روی یک فایل XML یا نوشتن بر روی آن کتابخانههای زیادی وجود دارد! خودتان هم میتوانید کمی وقت بگذارید و یکی بنویسید! اینجا از StAX استفاده میکنیم. خیلی سخت نیست، قابلیتهای زیادی هم دارد. مطمئن شوید که این کتابخانه را به پروژه خود اضافه کرده باشید. من از گردل استفاده میکنم: (اگر در مورد انتخاب StAX شک دارید اینجا را بخوانید)
// https://mvnrepository.com/artifact/stax/stax-api
compile group: 'stax', name: 'stax-api', version: '1.0.1'
چون قرار نیست فیلد خاصی در SettingLoader.java داشته باشیم و تنها به یک موجودیت از آن احتیاج داریم میتوانیم از دیزاین پترن Singleton برای نوشتن این کلاس استفاده کنیم:
تقریبا کارمان تمام شده است! حالا کافیست هر کجا که میخواهیم یک Setting بسازیم و با SettingLoader یک فایل XML را تبدیل به یک موجودیت از نوع Setting کنیم. به روشهای مختلفی میتوانیم از Setting استفاده کنیم مثلا این کلاس Constants.java را نگاه کنید، متد ()init آن توسط یک setting فراخوانی میشود و مقادیر استاتیک را به مقادیری که در XML آبجکت setting نوشتهایم تغییر میدهد.
حالا هر کجای برنامه که خواستیم میتوانیم از این مقادیر استاتیک به سادگی استفاده کنیم و هر وقت که خواستیم آنها را تغییر بدهیم متد init را با setting دیگری فراخوانی کنیم بدون اینکه به جای دیگری از برنامه دست ببریم. در این ویدیو هم کلاس Loader فایل XML و نحوه استفاده از آن را بیشتر توضیح دادهام:
این هم یک مثال دیگر از خواندن فایل XML در جاوا: https://www.journaldev.com/1191/java-stax-parser-example-read-xml-file
چطور در جاوا روی یک فایل XML بنویسیم؟
من خیلی به این بخش نیازی نداشتم اما احساس کردم ممکن است به درد شما بخورد! فقط چند لینک همینجا میگذارم که بعدا خودم هم بتوانم مراجعه کنم.
https://www.journaldev.com/892/how-to-write-xml-file-in-java-using-java-stax-api
مطلبی دیگر از این انتشارات
کد تمیز چیست و چرا اهمیت دارد؟
مطلبی دیگر از این انتشارات
کدام لایسنس را انتخاب کنیم؟
مطلبی دیگر از این انتشارات
آموزش دیزاین پترن Decorator با طعم پیتزا