CodeGym /جاوا بلاگ /Random-SD /جاوا ۾ تبديلين تائين رسائي
John Squirrels
سطح
San Francisco

جاوا ۾ تبديلين تائين رسائي

گروپ ۾ شايع ٿيل
سلام اڄ جي سبق ۾، اسان رسائي موڊيفائرز جي تصور کان واقف ٿينداسين ۽ مثالن تي غور ڪنداسين ته انهن سان ڪيئن ڪم ڪجي. يقيناً، 'واقف حاصل ڪريو' چوڻ بلڪل صحيح نه آهي: توهان اڳئين سبقن مان انهن مان اڪثر کان واقف آهيو. بس صورت ۾، اچو ته سڀ کان اهم نقطي جي اسان جي يادگيري کي تازو ڪريون. تبديل ڪندڙ رسائي اڪثر ڪري لفظ آهن جيڪي توهان جي ڪوڊ جي مختلف حصن تائين رسائي کي منظم ڪن ٿا. ڇو 'اڪثر ڪري'؟ ڇاڪاڻ ته انهن مان هڪ لفظ جي استعمال کان سواءِ ڊفالٽ طور مقرر ڪيو ويو آهي :) جاوا وٽ چار رسائي موڊيفائر آهن. اسان انهن کي ترتيب ۾ لسٽ ڪريون ٿا سڀ کان وڌيڪ پابنديون کان وٺي تمام 'نرم' تائين:
  • خانگي؛
  • ڊفالٽ (پيڪيج نظر اچي ٿو)؛
  • محفوظ ٿيل؛
  • عوامي.
اچو ته انهن مان هر هڪ تي هڪ نظر رکون ۽ سڃاڻپ ڪريو جڏهن اهي مفيد ٿي سگهن ٿيون. ۽ اسان مثال ڏينداسين :)

پرائيويٽ تبديل ڪندڙ

رسائي تبديل ڪندڙ.  پرائيويٽ، محفوظ، ڊفالٽ، عوامي - 2پرائيويٽ سڀ کان وڌيڪ محدود رسائي موڊيفائر آهي. اهو ڊيٽا ۽ طريقن جي نمائش کي محدود ڪري ٿو هڪ واحد طبقي جي اندر. توھان ڄاڻو ٿا ھن موڊيفائر کي سبق مان حاصل ڪندڙ ۽ سيٽرز بابت. هي مثال ياد آهي؟
public class Cat {

   public String name;
   public int age;
   public int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }
}

public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();
       cat.name = "";
       cat.age = -1000;
       cat.weight = 0;
   }
}
اسان اڳئين سبق ۾ ان تي غور ڪيو. اسان هتي هڪ سنگين غلطي ڪئي آهي: اسان پنهنجي ڊيٽا کي عوامي بڻايون ٿا، جيڪو ساٿي پروگرامرز کي سڌو سنئون فيلڊ تائين رسائي ۽ انهن جي قدرن کي تبديل ڪرڻ جي اجازت ڏئي ٿو. وڌيڪ ڇا آهي ... اهي قيمتون بغير ڪنهن چيڪ جي مقرر ڪيون ويون آهن. ان جو مطلب اهو آهي ته اسان جو پروگرام "" نالي هڪ ٻلي ٺاهي سگهي ٿو جنهن جي عمر -1000 سال ۽ وزن 0. هن مسئلي کي حل ڪرڻ لاءِ، اسان گيٽر ۽ سيٽرز استعمال ڪيا، ۽ ڊيٽا تائين رسائي کي محدود ڪرڻ لاءِ پرائيويٽ موڊيفائر پڻ استعمال ڪيو.
public class Cat {

   private String name;
   private int age;
   private int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       // input parameter check
       this.name = name;
   }

   public int getAge() {
       return age;
   }

   public void setAge(int age) {
       // input parameter check
       this.age = age;
   }

   public int getWeight() {
       return weight;
   }

   public void setWeight(int weight) {
       // input parameter check
       this.weight = weight;
   }
}
بنيادي طور تي، فيلڊ تائين رسائي کي محدود ڪرڻ ۽ حاصل ڪندڙن ۽ سيٽرن کي لاڳو ڪرڻ سڀ کان عام مثال آهن ته ڪيئن نجي حقيقي ڪم ۾ استعمال ٿيندو. ٻين لفظن ۾، هن ترميمي جو بنيادي مقصد هڪ پروگرام ۾ encapsulation حاصل ڪرڻ آهي. اهو صرف فيلڊ تي لاڳو نٿو ٿئي، رستي جي ذريعي. تصور ڪريو ته توھان جي پروگرام ۾ ھڪڙو طريقو آھي جيڪو ڪجھ تمام پيچيده ڪارڪردگي کي لاڳو ڪري ٿو. ڇا اسان مثال طور پيش ڪري سگھون ٿا؟ اچو ته چئو ته توهان جو readDataFromCollider() طريقو ڊيٽا ايڊريس جي ان پٽ طور قبول ڪري ٿو، بائيٽ فارميٽ ۾ Large Hadron Collider کان ڊيٽا پڙهي ٿو، هن ڊيٽا کي ٽيڪسٽ ۾ بدلائي ٿو، ان کي فائل ۾ لکي ٿو، ۽ پرنٽ ڪري ٿو. جيتوڻيڪ طريقي جي وضاحت خوفناڪ نظر اچي ٿي، ڪوڊ بابت ڪجهه به نه چوڻ لاءِ :) ڪوڊ کي وڌيڪ پڙهڻ لائق بڻائڻ لاءِ، اهو بهتر ٿيندو ته طريقي جي سڀني پيچيده منطق کي هڪ جاءِ تي نه لکجي. ان جي بدران، اسان کي الڳ الڳ طريقن ۾ ڪارڪردگي کي ٽوڙڻ گهرجي. مثال طور، readByteData() طريقو ڊيٽا پڙهڻ لاءِ ذميوار آهي، convertBytesToSymbols() طريقو ڪليڊر مان پڙهيل ڊيٽا کي ٽيڪسٽ ۾ بدلائي ٿو، saveToFile() طريقو وصول ٿيل ٽيڪسٽ کي فائل ۾ محفوظ ڪري ٿو، ۽ printColliderData() طريقو اسان جي پرنٽ ڪري ٿو. ڊيٽا فائل. آخر ۾، اسان جو readDataFromCollider() طريقو وڌيڪ آسان ٿيندو:
public class ColliderUtil {

   public void readDataFromCollider(Path pathToData) {
       byte[] colliderData = readByteData(pathToData);
       String[] textData = convertBytesToSymbols(colliderData);
       File fileWithData = saveToFile(textData);
       printColliderData(fileWithData);
   }

   public byte[] readByteData(Path pathToData) {

       // Reads data in bytes
   }

   public String[] convertBytesToSymbols(byte[] colliderDataInBytes) {

       // Converts bytes to characters
   }

   public File saveToFile(String[] colliderData) {

       // Saves read data to a file
   }

   public void printColliderData(File fileWithColliderData) {

       // Prints data from the file
   }
}
بهرحال، جيئن توهان انٽرفيس بابت سبق مان ياد ڪندا، استعمال ڪندڙ صرف خارجي انٽرفيس تائين رسائي حاصل ڪري ٿو. ۽ اسان جا 4 طريقا ان جو حصو نه آهن. اهي مددگار طريقا آهن: اسان انهن کي ڪوڊ جي پڙهڻ جي قابليت کي بهتر بڻائڻ ۽ چار مختلف ڪمن کي هڪ طريقي سان نه ڪرڻ لاءِ ٺاهيو آهي. توهان کي ضرورت ناهي ته صارف کي انهن طريقن تائين رسائي ڏيو. جيڪڏهن صارفين کي رسائي آهي convertBytesToSymbols() طريقي سان جڏهن ڪليڊر سان ڪم ڪري رهيا آهن، اهي گهڻو ڪري صرف طريقي سان پريشان ٿي ويندا ۽ حيران ٿي ويندا ته اهو ڇا لاءِ آهي. ڪهڙا بائيٽ تبديل ڪيا ويا آهن؟ اهي ڪٿان آيا؟ انهن کي متن ۾ ڇو تبديل ڪيو؟ هن طريقي ۾ جاري ڪيل منطق استعمال ڪندڙ کي ظاهر ڪيل انٽرفيس جو حصو نه آهي. صرف readDataFromCollider() طريقو انٽرفيس جو حصو آھي. پوء اسان انهن چار 'اندروني' طريقن سان ڇا ڪريون؟ ساڄو! انهن تائين رسائي کي محدود ڪرڻ لاءِ پرائيويٽ موڊيفائر استعمال ڪريو . ائين ڪرڻ انهن کي اجازت ڏئي ٿو پرامن طريقي سان ڪلاس اندر پنهنجو ڪم سرانجام ڏئي صارف کي پريشان ڪرڻ کان سواءِ، جنهن کي هر هڪ طريقي جي منطق کي ڄاڻڻ جي ضرورت ناهي.
public class ColliderUtil {

   public void readDataFromCollider(Path pathToData) {
       byte[] colliderData = readByteData(pathToData);
       String[] textData = convertBytesToSymbols(colliderData);
       File fileWithData = saveToFile(textData);
       printColliderData(fileWithData);
   }

   private byte[] readByteData(Path pathToData) {
       // Reads data in bytes
   }

   private String[] convertBytesToSymbols(byte[] colliderDataInBytes) {
       // Converts bytes to characters
   }

   private File saveToFile(String[] colliderData) {
       // Saves read data to a file
   }

   private void printColliderData(File fileWithColliderData) {
       // Prints data from the file
   }
}

محفوظ ٿيل ترميمي

اڳيون سڀ کان وڌيڪ پابنديون تبديل ڪندڙ محفوظ آهي . محفوظرسائي تبديل ڪندڙ.  خانگي، محفوظ، ڊفالٽ، عوامي - 3 رسائي موڊيفائر پاران نشان لڳل فيلڊز ۽ طريقا نظر ايندا:
  • سڀني طبقن ۾ اسان جي ساڳي پيڪيج ۾ شامل آهي؛
  • سڀني طبقن جي اندر جيڪي اسان جي طبقي جو وارث آهن.
پهرين ۾، اهو تصور ڪرڻ ڏکيو آهي جڏهن اهو گهربل هجي. حيران نه ٿيو: پرائيويٽ جي ڀيٽ ۾ محفوظ لاءِ تمام گهٽ استعمال جا ڪيس آهن ، ۽ اهي تمام مخصوص آهن. تصور ڪريو ته اسان وٽ هڪ AbstractSecretAgent خلاصو ڪلاس آهي جيڪو ڪجهه انٽيليجنس سروس ۾ هڪ ڳجهي ايجنٽ جي نمائندگي ڪري ٿو، انهي سان گڏ هڪ top_secret پيڪيج جيڪو هن طبقي ۽ ان جي اولاد تي مشتمل آهي. ڪنڪريٽ طبقن جهڙوڪ FBISecretAgent ، MI6SecretAgent ، MossadSecretAgent ، وغيره ان کي ورثي ۾ ملن ٿا. خلاصي طبقي جي اندر، اسان هڪ ايجنٽ جي انسداد کي لاڳو ڪرڻ چاهيون ٿا. اهو وڌي ويندو جڏهن هڪ نئون ايجنٽ پروگرام ۾ ڪٿي پيدا ڪيو ويندو. پيڪيج top_secret ؛
public abstract class AbstractSecretAgent {

   public static int agentCount = 0;
}
پر اسان جا ايجنٽ راز آهن! هن جو مطلب اهو آهي ته اهي ۽ ٻيو ڪو به نه ڄاڻڻ گهرجي ته انهن مان ڪيترا موجود آهن. اسان آساني سان agent_counter فيلڊ ۾ محفوظ ترميمي کي شامل ڪري سگھون ٿا . پوءِ اسان جي top_secret پيڪيج ۾ موجود ٻين ڳجهي ايجنٽ طبقن ۽ ٻين طبقن جا مثال ان جي قيمت حاصل ڪري سگھن ٿا.
public abstract class AbstractSecretAgent {

   protected static int agent_counter = 0;
}
۽ اھو ھڪڙي قسم جي خاص ڪم آھي جنھن کي محفوظ موڊيفائر جي ضرورت آھي :)

پيڪيج نظر ايندڙ تبديليءَ وارو

فهرست تي اڳيون ڊفالٽ موڊيفائر آھي، جنھن کي پيڪيج نظر ايندڙ موڊيفائر جي نالي سان پڻ سڃاتو وڃي ٿو . اهو ڪنهن لفظ سان ظاهر نه ڪيو ويو آهي، ڇاڪاڻ ته جاوا ان کي ڊفالٽ طور سڀني شعبن ۽ طريقن تي لاڳو ڪري ٿو. جيڪڏهن توهان پنهنجي ڪوڊ ۾ هيٺ ڏنل لکندا آهيو:
int x = 10
x variable هن پيڪيج کي ڏسڻ واري رسائي هوندي . اهو ياد ڪرڻ آسان آهي ته اهو ڇا ڪندو آهي. بنيادي طور تي، ڊفالٽ = محفوظ وراثت :) محفوظ ٿيل ترميمي وانگر ، ان جي درخواست محدود آهي. گهڻو ڪري، ڊفالٽ رسائي هڪ پيڪيج ۾ استعمال ڪيو ويندو آهي جنهن ۾ ڪجهه يوٽيلٽي ڪلاس آهن جيڪي پيڪيج ۾ ٻين سڀني طبقن جي ڪارڪردگي تي عمل نه ڪندا آهن. اچو ته هڪ مثال ڏيو. تصور ڪريو ته اسان وٽ ھڪڙو 'سروسز' پيڪيج آھي. اهو مختلف طبقن تي مشتمل آهي جيڪي ڊيٽابيس سان ڪم ڪن ٿيون. مثال طور، اتي ھڪڙو UserService ڪلاس آھي جيڪو پڙھي ٿو يوزر ڊيٽا ڊيٽابيس مان، ھڪڙو CarService ڪلاس آھي جيڪو پڙھي ٿو ڪار ڊيٽا ساڳي ڊيٽابيس مان، ۽ ٻيا طبقا، جن مان ھر ھڪ مخصوص قسم جي شين سان ڪم ڪري ٿو ۽ ڊيٽابيس مان لاڳاپيل ڊيٽا پڙھي ٿو.
package services;

public class UserService {
}

package services;

public class CarService {
}
پر اهو آسان هوندو ته ڊيٽابيس ۾ موجود ڊيٽا هڪ فارميٽ ۾ هجي ۽ اسان کي ان جي ضرورت ٻئي ۾ هجي. تصور ڪريو ته ڊيٽابيس ۾ صارفين جي ڄمڻ جي تاريخن کي محفوظ ڪيو ويو آهي <TIMESTAMP WITH TIME ZONE>...
2014-04-04 20:32:59.390583+02
...۽ ان جي بدران اسان کي سادو شئي جي ضرورت آهي - هڪ java.util.Date . هن مسئلي کي حل ڪرڻ لاء، خدمتن جي پيڪيج اندر، اسان هڪ خاص ميپر ڪلاس ٺاهي سگهون ٿا. اهو ڊيٽابيس مان ڊيٽا کي اسان جي واقف جاوا شين ۾ تبديل ڪرڻ جو ذميوار هوندو. هڪ سادي مددگار طبقو. اسان عام طور تي سڀني طبقن کي پبلڪ ڪلاس جي طور تي اعلان ڪندا آهيون ClassName ، پر اهو گهربل ناهي. اسان پنهنجي مددگار طبقي کي صرف ڪلاس ميپر طور اعلان ڪري سگھون ٿا . انهي حالت ۾، اهو اڃا تائين پنهنجو ڪم ڪري ٿو، پر اهو ڪنهن کي نظر نٿو اچي ته سروسز پيڪيج کان ٻاهر!
package services;

class Mapper {
}


package services;

public class CarService {

   Mapper mapper;
}
۽ هتي بنيادي استدلال آهي: ڇو ڪنهن پيڪيج کان ٻاهر ڪنهن کي مددگار ڪلاس ڏسڻ جي ضرورت پوندي جيڪا صرف انهي پيڪيج ۾ ڪلاسن سان ڪم ڪري؟

عوامي ترميم ڪندڙ

۽ آخري نه پر گهٽ ۾ گهٽ، عوامي ترميم ڪندڙ! توهان هن موڊيفائر سان پنهنجي پڙهائي جي پهرين ڏينهن تي CodeGym تي ملاقات ڪئي جڏهن توهان پهريون ڀيرو عوامي جامد void main(String[] args) هلائيندا هئا . رسائي تبديل ڪندڙ.  خانگي، محفوظ، ڊفالٽ، عوامي - 4هاڻي ته توهان انٽرفيس جي باري ۾ سبق جو مطالعو ڪيو آهي، ان جو مقصد توهان لاءِ واضح آهي :) آخرڪار، عوام کي تبديل ڪرڻ وارو ٺاهيو ويو صارفين کي ڪجهه ڏيڻ لاءِ. مثال طور، توهان جي پروگرام جو انٽرفيس. فرض ڪريو توهان هڪ ترجمو ڪندڙ پروگرام لکيو آهي جيڪو روسي متن کي انگريزي ۾ ترجمو ڪري سگهي ٿو. توھان ٺاھيو آھي ترجمو (String textInRussian) طريقو جيڪو سڀني ضروري منطق کي لاڳو ڪري ٿو. توھان ھن طريقي کي لفظ سان نشان لڳايو عوامي ، ۽ ھاڻي اھو انٽرفيس جو حصو آھي:
public class Translator {

   public String translate(String textInRussian) {

       // Translates text from Russian to English
   }
}
توهان هن طريقي کي اسڪرين تي 'ترجمو' بٽڻ تي پابند ڪري سگهو ٿا ۽ توهان ڪيو آهي! ڪو به ان کي استعمال ڪري سگهي ٿو. ڪوڊ جا حصا جيڪي عوامي ترميم ڪندڙ سان نشان لڳل آھن آخري استعمال ڪندڙ لاءِ آھن. حقيقي زندگيءَ جو مثال مهيا ڪرڻ، پرائيويٽ سڀني عملن لاءِ آهي جيڪي ٽي وي اندر ٿين ٿا، پر عوامي آهي ٽي وي کي منظم ڪرڻ لاءِ استعمال ٿيندڙ ريموٽ ڪنٽرول جي بٽڻن لاءِ. وڌيڪ ڇا آهي، صارف کي ڄاڻڻ جي ضرورت ناهي ته ٽيليويزن ڪيئن ٺهيل آهي يا اهو ڪيئن ڪم ڪري ٿو. ريموٽ ڪنٽرول عوامي طريقن جو سيٽ آهي : on() , off() , nextChannel() , previousChannel() , increaseVolume() , reduceVolume() وغيره . جيڪو توهان سکيو آهي ان کي مضبوط ڪرڻ لاءِ، اسان مشورو ڏيون ٿا ته توهان هڪ وڊيو سبق ڏسو اسان جا جاوا ڪورس
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION