الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

لماذا الlocal Varaible أفضل ؟

مغلق
بدأه Reehan في 23 سبتمبر 2007 · 18 رد · 1,769 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته..

السؤال هو ::

لماذا تعتبر المتغيرات المتعرفة في الكود ك

local varaible

أفضل من المتغيرات المتعرفة ك

Global varaible

?

وشكرا للجميع

#2

السلام عليكم ورحمة الله وبركاته..

ومن قال أنه أفضل!!!

فكلتاهما مفيدان وحسب المتطلبات نعرف المتغير خاص أو عام. عندما نحتاج إلى مشاركة متغير مع عدة دوال فهنا نعرفه بعام أما يسمى Global ....

#3

افضل من اي ناحيه ، الاداء ، الذاكره ، الOO ، من اي ناحيه تقصد ؟

وش تقصد ب Global variable ، اتمنى نكون محددين

في الجافا هناك عدة أنواع من المتغيرات

static variable

instance variable

local variable

#4

السلام عليكم

الجافا ليس فيها Global Variables

هنالك نوعين Instance Variable وقد تكون Static or None Static و يتم تعريفها داخل المعرف Class

النوع الثاني Local Variables و يتم تعريفها في Method / Block

الفرق بينهم Instance Variable دائما تحفظ في HEAP سواء كانت Complex/Refernce type or Primitive type بينما Local Variables يتم حفظهم في Stack ما لم يكون Complex Types (Refernce Types))

ونعم صحيح الأفضل هو استخدام Local Variables قدر المستطاع وذلك لأن Instance Variable تحتاج إلى حذر عند التعامل معها فمثلاُ تخيل أن لديك Instance Variable متغير ثابتStatic و في احد الدوال الثابتة Static Method تقوم بتغيير قيمته. عندما يكون برنامجك Single Thread فلن تواجه مشاكل لكن تخيل ان برنامجك MultiThreaded كما هو الحال في الويب. هنا سوف تقع في مشكلة وتحتاج أن تجعل تلك الدالة Thread Safe Method من خلال استخدام أحد الطريق التي تخولك من عمل دالة Thread Safe بإستخدام الأمر synchronized مثلاُ.

لتفاصيل أكثر عن كيفية عمل Heap و Stack

http://www.mostasharok.net/Articles/Articl...&Article=27

سوف أضيف مقالة عن كيفية عمل Thread Safe Method قر يباً كما هو معمول في JRE أو حتى .NETFramework

#5

الراجل سأل السؤال و سبنا نكتشف هو كان قصده إيه و نجاوب على تخميناتنا !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

اقتباس
لفرق بينهم Instance Variable دائما تحفظ في HEAP سواء كانت Complex/Refernce type or Primitive type بينما Local Variables يتم حفظهم في Stack ما لم يكون Complex Types (Refernce Types))
#6
اقتباس
هنالك نوعين Instance Variable وقد تكون Static or None Static و يتم تعريفها داخل المعرف Class

لاأعتقد ان مصطلح Instance Variable يشمل Static فالأخيره هي Class Variable بمعنى انها على مستوى الكلاس

اقتباس

حقيقة ماأدري عن الدوت نيت ، ولكن بالجافا لايتم حفظ الدوال نفسها في الStack

الStack لديه طريقه لاستدعاء الدوال ولكن هي حقيقة غير موجوده بالStack موجوده بمكان ناسي أسمه بالضبط

pointers لايوجد بالجافا مؤشرات يوجد bit holder

اقتباس
سوف أضيف مقالة عن كيفية عمل Thread Safe Method قر يباً كما هو معمول في JRE أو حتى .NETFramework

أتمنى ذلك مع خالص شكري وتقديري

#7

المكان الذي يخزن فيه الدوال هو permanent generation وهو مكان خاص بالهيب

اقتباس
The permanent generation is special because it holds data needed by the virtual machine to describe objects that do not have an equivalence at the Java language level. For example objects describing classes and methods are stored in the permanent generation.

ماعليش على المداخله ولكن اعتقد انه تهمك مثل هالمعلومات

بالتوفيق أخي

#8

عندي سؤال للإخوه في نفس الموضوع

اولا تحكون عن Instance Variable ايش فرقه عن public variable

يعني لو اعرف متغير في اي Method على انه public هنا الا يمكن الوصول اليه من اي مكان في الكلاس ؟

السؤال الثاني

لو اعرف متغير على انه private في الكلاس هل اقدر اصل اليه في اي Method في هذه الكلاس ؟

اطيب تحية

تم تعديل هذه المشاركة بواسطة Kmarwani في 29 سبتمبر 2007 في 23:57

#9

السلام عليكم

أخي العزيز ، عيسى عايد العنزي

في البداية اشكرك على قراءة المقال،

المقال لم يكن مخصص فقط للغة الجافاً و على العموم حتى الدوت نت لا تحتوى على مؤشرات بشكل عام (إذا اغفلنا استخدام Un-Managed C++ Code) ، بعد النظر على المقالة وجد أني لم أوضح ماقصدة بشكل دقيق، هذه المؤشرات يتم انشائها و التحكم بها في (CLR for .NET) و (JVM for java) وهذا أمر طبيعي في الذاكرة عند انشاء كائن فإنه يوجد له مؤشر يؤشر إلى مكانه في الذاكرة، اتوقع انك تتفق معي ان (Object) في لغة الجافا يتم حفظها في HEAP، طيب لنفترض انك قمت بكتابة الدالة التالية، بحث عملت بإنشاء كائن داخل الدالة ثم قمت بإرجاع ذلك الكائن كا Return value

private MyClass dummyMethod()
{
 MyClass myclass = new MyClass();
 return  myclass;
}

الآن من الأشياء المسلمة بها في علم البرمجة أن Return Value تخزن في Stack. بما ان الكائن مخزن في Heap فكيف تستطيع الوصول إليه بعد استدعاء تلك الدالة.؟

بالنسبة لكلامك عن حفظ الدالة فبصراحة لم افهم قصدك، هل تقصد ان الأوامر التي في داخل الدالة؟

على العموم أن كان ذلك فكل ما درسناه في الجامعة غير صحيح. ما درسناه أنه في حال إستدعاء أي دالة يتم عمل Push للأوامر ومن ثم يتم عمل pop لتنفيذها. و هذا مطبق على جميع الدوال في جميع لغات البرمجة ان لم اكن مخطأَ.

بالنسبة إلى Instance Variable فكلامك صحيح و أعتذر عن الخطأ االغير مقصود.

#11

ماأدري اتضحت النقطه أم لا ؟

نقطتي كانت :

الاوبجكت سيخزن بالهيب متى مانتهت الداله فسوف يكون مؤهل للGC

الآن انت قمت بارجاعه بمعنى أنه سيتم موجود لأن هناك Reference حي يستطيع الوصول إلى ذلك الاوبجكت

نعم الطريقه هي انك عن طريق Stack تطبق بعض الأوامر الإداريه Administration Instructions التي تمكنك من مناداة الداله الخاصه بذلك الاوبجكت ،

الStack لايحتوي الـBehavior and Signature of methods ولا الHeap يحتويهن

كل هذه الأمور تحمل وقت Class Loading في منطقة permanent generation

هذا ماقصدته

ألف شكر على رحابة صدرك

#12
اقتباس
اولا تحكون عن Instance Variable ايش فرقه عن public variable

اقصد ب Instance Variable كل متغير يعبر عن خاصيه بالاوبجكت مثل

class Student { public String name;}

name هو Instance variable قد يكون public or protected or private or nothing

اقتباس
لو اعرف متغير على انه private في الكلاس هل اقدر اصل اليه في اي Method في هذه الكلاس ؟

أكيد ، مادمت في الكلاس فلك الحق في استخدام أي Instance Variable حتى لو كان private

ابحث عن access modifier in java بقوقل

#13

السلام عليكم

أخي العزيز عيسى سعدت بالنقاش مع شخص خبير مثك

أنا مهتم جداً في هذا النقاش و ان كان هنالك أي خطأ في المقالة فأود تصحيحه.

أتفق معك بخصوص permanent generation بأنه يستخدم من قبل ClassLoader لحفظ بيانات عن Class و ليس Object، اأنا تحدثت عن Heap و Stack بشكل عام سواء في بيئة الجافا أو في الدوت نت، بتالي لم أتطرق لهذا الأمر خصوصاُ وانه متعلق JVM.

لم أقل ان Method Signature يتم حفظه في Heap أو Stack ولكن قصدت اللأوامر التي تنفيذ و بالتالي لا أرى أن Method Behavior يحفظ في permanent generation وذلك لأن Method Behavior هو بالفعل محتوى الدالة، بينما Method Signature يتم حفظه كما ذكرت في permanent generation. وهذا يفسر لماذا يتوجب إضافة Class في CLASSPATH و عند تكرر نفس Class في اكثر من مكان فسوف يقوم ClassLoader بتجاهل جميع تلك Classes بعد تحميل النسخة الأول التي وجدها، و تجد العديد من المبرمجين يواجهون مشكلة وهي انه بعد التعديل على ملف لا يجدون أن تغييرهم يأخذ تأثيراً، و السبب أن ClassLoader لديه نسخة قديمة من الكود!!!

سعدت مرة أخرى بالنقاش معك و إن كنت تجد كلامي غير صحيح الرجاء التصحيح، وشكرا لك.

#14

أخي نواف ، انا لم أقل انك مخطئ ، فانت أعلم مني واستاذي في هذه الأمور

كل كلامك صحيح ماعدا ان method behavior او بالأصح bytecode for method behavior يحفظ بالStack

اقتباس
The method area is created on virtual machine start-up. Although the method area is logically part of the garbage-collected heap, simple implementations may choose to neither garbage collect nor compact it. This version of the Java Virtual Machine specification does not mandate the location of the method area or the policies used to manage compiled code. The method area may be of a fixed size, or may be expanded as required by the computation and may be contracted if a larger method area becomes unnecessary. The memory for the method area does not need to be contiguous.

هذا من كتاب Java Language Specification

انا مازلت مبتدئ وقد يكون كل كلامي خطأ ، ولكن هذا ماأعرفه لأن لايعقل أن تنسخ behavior لكل thread فال behavior ثابت

تم تعديل هذه المشاركة بواسطة عيسى عايد العنزي في 30 سبتمبر 2007 في 19:27

#15

أعتقد إن السؤال واضح ولا يحتاج إلى هذا التتشعب..الأخ يسأل لماذا ينصح دائماً بإستخدام الـ local variable عند تعريف method أو block معين وعدم الإعتماد على variables عامة (global)

والسبب في ذلك لستهيل عملية الـ resusability للـ method أو الـ block بحيث ممكن إستخدامها في أكثر من موضع وهو الآمر الذي يصعب تحقيقه بإستخدام الـ global varibles لأنه راح يزيد إرتباطيتها بالـ class وما ماراح يخليها مستقلة او general.

النقطة الثانية: لتسهيل عملية الـ maintenance للـ method في المستقبل بحيث تكون المنطقة الي راح أعملها صيانة محصورة داخل الـ scope تبعها ولا لها إرتباطات خارجية.

و هذا من وجهة نظر هندسة برمجيات.

تم تعديل هذه المشاركة بواسطة eXotic في 2 أكتوبر 2007 في 05:21

#16

أخي eXotic كلامك جميل ولكن كيف تتحقق الreusability بهذه الطريقه ، هل ممكن ترفق كود يشرح هذا

ان كان لديك كتاب او مقاله تناقش هندسة البرمجيات بالجافا ، اتمنى تساعدنا بها ،

شكراً جزيلاً

#17

هلا فيك أخوي عيسى..هذا مثال بسيط يوصل الفكرة.

لنفترض التالي:

(1): قرض بنكي.

/*
* Loan.java
* 
* Created on Oct 4, 2007, 8:00:21 AM
* 
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package reusability;

/**
*
* @author eXotic
*/
public class Loan {

	//...

	double amount;
	double interestPercentage;

	// ...


	public double getRecievable(double amount,double interestPercentage){  // Reusable Method.

		return amount-(amount*interestPercentage/100.0);

	}

		public double getRecievable(){ // Optional auxiliary method to make it easier when the caller is the bank.

		return getRecievable(amount,interestPercentage);

	}

}

(2): سيارة أجرة.

/*
* rentCar.java
* 
* Created on Oct 4, 2007, 9:00:14 AM
* 
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package reusability;

/**
*
* @author eXotic
*/
public class rentCar {

...

}

(3): الـ Main Method.

/*
* Main.java
* 
* Created on Oct 4, 2007, 7:52:09 AM
* 
* To demonstrate method reusability.
*/

package reusability;

/**
*
* @author eXotic
*/
public class Main {

	/**
	 * @param args the command line arguments
	 */
	public static void main(String[] args) {

		Loan myLoan=new Loan();

		rentCar myRentCar=new rentCar();


		System.out.println("The payable amount by the borrower: " +  myLoan.getRecievable()); // Bank Call


		System.out.println("The payable amount by the renter:" +myLoan.getRecievable(x,y)); // Car Rental Call.


	}

}

تم تعديل هذه المشاركة بواسطة eXotic في 4 أكتوبر 2007 في 09:43

#18

مثل مانشوف إن الـ method :

public double getRecievable(double amount,double interestPercentage){...}

إستفدنا منها مرتين في كلاسين مختلفين والفضل للـ Parameterization و بالتالي صارت العمليات تطبق على local variables وهي في حالتنا هنا الـ parameters.

طبعاً ممكن الواحد يقول الفكرة تافهة نوعاً ما لكن لك أن تقيسها على الـ large-scale لما يكون عندك مثلاً تطوير نظام محاسبي ضخم أو نظام تشغيل.

بينما لو كان Loan تعريفه كالتالي:

/*
* Loan.java
* 
* Created on Oct 4, 2007, 8:00:21 AM
* 
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package reusability;

/**
*
* @author eXotic
*/
public class Loan {

	//...

	double amount;
	double interestPercentage;

	// ...


		public double getRecievable(){  // Reusable Method.

		return amount-(amount*interestPercentage/100.0);

	}

	}

}

أصبحت الـ method مربوطة بالـ class.

تم تعديل هذه المشاركة بواسطة eXotic في 4 أكتوبر 2007 في 09:41

#19

41KFXJZ310L._AA240_.jpg

هذا كتاب جميل بالحقيقة في مجال هندسة البرمجيات و يطبق كافة مفاهيمه و أمثلته بالجافا.

ولكن للأسف لا أملك منه Softcopy.

http://www.amazon.com/Software-Design-Arch...9546&sr=8-1

هذا الموضوع مغلق.

مواضيع مشابهة