السلام عليكم ورحمة الله وبركاته..
السؤال هو ::
لماذا تعتبر المتغيرات المتعرفة في الكود ك
local varaible
أفضل من المتغيرات المتعرفة ك
Global varaible
?
وشكرا للجميع
السلام عليكم ورحمة الله وبركاته..
السؤال هو ::
لماذا تعتبر المتغيرات المتعرفة في الكود ك
local varaible
أفضل من المتغيرات المتعرفة ك
Global varaible
?
وشكرا للجميع
افضل من اي ناحيه ، الاداء ، الذاكره ، الOO ، من اي ناحيه تقصد ؟
وش تقصد ب Global variable ، اتمنى نكون محددين
في الجافا هناك عدة أنواع من المتغيرات
static variable
instance variable
local variable
السلام عليكم
الجافا ليس فيها 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
الراجل سأل السؤال و سبنا نكتشف هو كان قصده إيه و نجاوب على تخميناتنا !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
اقتباسلفرق بينهم Instance Variable دائما تحفظ في HEAP سواء كانت Complex/Refernce type or Primitive type بينما Local Variables يتم حفظهم في Stack ما لم يكون Complex Types (Refernce Types))
اقتباسهنالك نوعين Instance Variable وقد تكون Static or None Static و يتم تعريفها داخل المعرف Class
لاأعتقد ان مصطلح Instance Variable يشمل Static فالأخيره هي Class Variable بمعنى انها على مستوى الكلاس
اقتباس
حقيقة ماأدري عن الدوت نيت ، ولكن بالجافا لايتم حفظ الدوال نفسها في الStack
الStack لديه طريقه لاستدعاء الدوال ولكن هي حقيقة غير موجوده بالStack موجوده بمكان ناسي أسمه بالضبط
pointers لايوجد بالجافا مؤشرات يوجد bit holder
اقتباسسوف أضيف مقالة عن كيفية عمل Thread Safe Method قر يباً كما هو معمول في JRE أو حتى .NETFramework
أتمنى ذلك مع خالص شكري وتقديري
المكان الذي يخزن فيه الدوال هو 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.
ماعليش على المداخله ولكن اعتقد انه تهمك مثل هالمعلومات
بالتوفيق أخي
عندي سؤال للإخوه في نفس الموضوع
اولا تحكون عن Instance Variable ايش فرقه عن public variable
يعني لو اعرف متغير في اي Method على انه public هنا الا يمكن الوصول اليه من اي مكان في الكلاس ؟
السؤال الثاني
لو اعرف متغير على انه private في الكلاس هل اقدر اصل اليه في اي Method في هذه الكلاس ؟
اطيب تحية
تم تعديل هذه المشاركة بواسطة Kmarwani في 29 سبتمبر 2007 في 23:57
السلام عليكم
أخي العزيز ، عيسى عايد العنزي
في البداية اشكرك على قراءة المقال،
المقال لم يكن مخصص فقط للغة الجافاً و على العموم حتى الدوت نت لا تحتوى على مؤشرات بشكل عام (إذا اغفلنا استخدام 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 فكلامك صحيح و أعتذر عن الخطأ االغير مقصود.
ماأدري اتضحت النقطه أم لا ؟
نقطتي كانت :
الاوبجكت سيخزن بالهيب متى مانتهت الداله فسوف يكون مؤهل للGC
الآن انت قمت بارجاعه بمعنى أنه سيتم موجود لأن هناك Reference حي يستطيع الوصول إلى ذلك الاوبجكت
نعم الطريقه هي انك عن طريق Stack تطبق بعض الأوامر الإداريه Administration Instructions التي تمكنك من مناداة الداله الخاصه بذلك الاوبجكت ،
الStack لايحتوي الـBehavior and Signature of methods ولا الHeap يحتويهن
كل هذه الأمور تحمل وقت Class Loading في منطقة permanent generation
هذا ماقصدته
ألف شكر على رحابة صدرك
اقتباساولا تحكون عن 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 بقوقل
السلام عليكم
أخي العزيز عيسى سعدت بالنقاش مع شخص خبير مثك
أنا مهتم جداً في هذا النقاش و ان كان هنالك أي خطأ في المقالة فأود تصحيحه.
أتفق معك بخصوص 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 لديه نسخة قديمة من الكود!!!
سعدت مرة أخرى بالنقاش معك و إن كنت تجد كلامي غير صحيح الرجاء التصحيح، وشكرا لك.
أخي نواف ، انا لم أقل انك مخطئ ، فانت أعلم مني واستاذي في هذه الأمور
كل كلامك صحيح ماعدا ان 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
أعتقد إن السؤال واضح ولا يحتاج إلى هذا التتشعب..الأخ يسأل لماذا ينصح دائماً بإستخدام الـ local variable عند تعريف method أو block معين وعدم الإعتماد على variables عامة (global)
والسبب في ذلك لستهيل عملية الـ resusability للـ method أو الـ block بحيث ممكن إستخدامها في أكثر من موضع وهو الآمر الذي يصعب تحقيقه بإستخدام الـ global varibles لأنه راح يزيد إرتباطيتها بالـ class وما ماراح يخليها مستقلة او general.
النقطة الثانية: لتسهيل عملية الـ maintenance للـ method في المستقبل بحيث تكون المنطقة الي راح أعملها صيانة محصورة داخل الـ scope تبعها ولا لها إرتباطات خارجية.
و هذا من وجهة نظر هندسة برمجيات.
تم تعديل هذه المشاركة بواسطة eXotic في 2 أكتوبر 2007 في 05:21
أخي eXotic كلامك جميل ولكن كيف تتحقق الreusability بهذه الطريقه ، هل ممكن ترفق كود يشرح هذا
ان كان لديك كتاب او مقاله تناقش هندسة البرمجيات بالجافا ، اتمنى تساعدنا بها ،
شكراً جزيلاً
هلا فيك أخوي عيسى..هذا مثال بسيط يوصل الفكرة.
لنفترض التالي:
(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
مثل مانشوف إن الـ 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

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