أنت تسأل نفسك: "كيف تكتب بطريقة نظيفة ومفهومة؟" كيف يمكن اكتشاف رمز شخص آخر بسرعة؟ "
تذكر القواعد أدناه وتطبيقها!
لا يناقش المقال القواعد الأساسية لتسمية المتغيرات والوظائف ، المسافة البادئة النحوية ، وموضوع إعادة التوسعة على نطاق واسع. نحن نعتبر 5 قواعد بسيطة لتبسيط الكود وتقليل الحمل على الدماغ أثناء عملية التطوير.
النظر في عملية إدراك البيانات لربط القواعد الموصوفة بعملية الإدراك وتحديد معايير الكود البسيط.
تتكون عملية الإدراك المبسطة من الخطوات التالية:
- البيانات الواردة من خلال مستقبلات تتفق مع الخبرة السابقة.
- إذا لم يكن هناك ارتباط ، فهذه ضوضاء. يتم نسيان الضجيج بسرعة. إذا كان هناك شيء ما يتعلق به ، يتم التعرف على الحقيقة.
- إذا كانت الحقيقة مهمة - نتذكر ، أو نتعميم ، أو نتصرف ، على سبيل المثال ، نقول أو نكتب الكود.
- لتقليل كمية المعلومات المحفوظة والمحللة ، يتم استخدام التعميم.
- بعد التلخيص ، يتم ربط المعلومات وتحليلها مرة أخرى (الخطوة 1).
يقسم العلماء الذاكرة إلى المدى القصير والمدى الطويل. الذاكرة قصيرة المدى صغيرة الحجم ، ولكن يتم استخراج المعلومات وتخزينها على الفور. الذاكرة قصيرة المدى هي ذاكرة التخزين المؤقت في المخ. ويمكن تخزين 7 + -2 الكلمات والأرقام والكائنات. تعد الذاكرة طويلة المدى أكبر في الحجم ، لكنها تتطلب طاقة (جهد) لحفظ المعلومات واستردادها أكثر من الذاكرة قصيرة المدى.
الاستنتاجات:
- كلما قل عدد العناصر ، قل استهلاك الطاقة ،
- يجب تقليل عدد العناصر المدركة إلى 9 ،
- استخدام الذاكرة طويلة المدى بأقل قدر ممكن: تعميم أو نسيان.
ننتقل إلى وصف القواعد.
القاعدة 1. نستخدم العبارة في الظروف ، تخلص من "لا".تؤدي إزالة العامل "غير" إلى تقليل عدد العناصر التي يتم تحليلها. أيضًا ، في العديد من لغات البرمجة ، يتم استخدام "!" لمشغل النفي. هذه الشخصية سهلة التخطي عند قراءة الكود.
قارن:
if (!entity.IsImportAvaible) {
بعد:
if (entity.IsImportAvaible) {
القاعدة 2. تخفيض مستوى التعشيش.أثناء تحليل الشفرة ، يحتاج كل مستوى تداخل إلى الاحتفاظ به في الذاكرة. تقليل عدد المستويات - تقليل تكلفة الوقود.
النظر في طرق للحد من عدد مستويات التعشيش.
1) عودة السيطرة. لقد قطعنا بعض الحالات ونركز على الحالات المتبقية.
if (conributor != null) {
تحويل إلى
if(contributor == null) { return; }
او
while( 1) { if( 2) { break; }
او
for(; 1;) { if( 2) { continue; }
تم تقديم مثال موسع في القاعدة 5. لاحظ رمي استثناء.
2) عزل الطريقة. اسم الوظيفة هو نتيجة التعميم.
if( ) { foreach(var sender in senders) { sender.Send(message); } }
في
if( ) { SendAll(senders, message); } void SendAll(IEnumerable<Sender> senders, string message) { foreach(var sender in senders) { sender.Send(message); } }
3) الجمع بين الظروف.
if (contributor == null) { if (accessMngr == null) {
في
if (contributor == null && accessMngr == null) {
4) إزالة المتغيرات وتقسيمها إلى كتل الدلالية. نتيجة لذلك ، يمكن تغيير الكتل بشكل مستقل ، والأهم من ذلك ، أن قراءة وفهم مثل هذا الكود أسهل بكثير. كتلة واحدة - وظيفة واحدة. حالة شائعة هي البحث مع المعالجة. من الضروري تقسيم الشفرة إلى كتل فاصلة منفصلة: البحث عن العناصر ومعالجتها.
for (int i=0;i<array.length;i++) { if (array[i] == findItem) {
في
for(int i=0;i<array.length;i++) { if(array[i] == findItem) { foundItem =array[i]; break; } } if (foundItem != null) {
القاعدة 3. نتخلص من المفهرسين والمكالمات من خلال الخصائص.مفهرس - عملية الوصول إلى عنصر صفيف في الفهرس arr [الفهرس].
في عملية إدراك الكود ، يعمل الدماغ مع الرموز [] كمحددات ، والمفهرس كتعبير.
function updateActiveColumnsSetting(fieldsGroups) { var result = {}; for (var i = 0; i < fieldsGroups.length; i++) { var fields = fieldsGroups[i].fields; for (var j = 0; j < fields.length; j++) { if (!result[fieldsGroups[i].groupName]) { result[fieldsGroups[j].groupName] = {}; } result[fieldsGroups[i].groupName][fields[j].field] = createColumnAttributes(j, fields[j].isActive); } } return JSON.stringify(result); }
المفهرس هو مكان للأخطاء المتكررة. بفضل أسماء الفهرس القصيرة ، من السهل جدًا خلط I أو j أو k.
في المثال أعلاه ، في نتيجة السطر [fieldsGroups [j] .groupName] = {}؛ خطأ ارتكب:
يستخدم j بدلاً من i.
للعثور على مكان استخدام القيمة i بالضبط ، يجب عليك:
1) بصريا تسليط الضوء على متغير مجموعة
function updateActiveColumnsSetting(fieldsGroups) { var result = {}; for (var i = 0; i < fieldsGroups.length; i++) { var fields = fieldsGroups[i].fields; for (var j = 0; j < fields.length; j++) { if (!result[fieldsGroups[i].groupName]) { result[fieldsGroups[j].groupName] = {}; } result[fieldsGroups[i].groupName][fields[j].field] = createColumnAttributes(j, fields[j].isActive); } } return JSON.stringify(result); }
2) لتحليل كل تواجد لاستخدام المفهرس المرغوب I ، j ، i-1 ، j-1 ، وما إلى ذلك ، مع مراعاة أماكن استخدام المفهرسين والمراجع المحددة بالفعل في الإدراك.
من خلال تسليط الضوء على المفهرس في متغير ، نقوم بتقليل عدد الأماكن الخطرة ويمكننا بسهولة استخدام المخ لإدراك المتغير ، دون الحاجة إلى الحفظ.
بعد المعالجة:
function updateActiveColumnsSetting(fieldsGroups) { var columnsGroups = {}; for (var i = 0; i < fieldsGroups.length; i++) { var fieldsGroup = fieldsGroups[i]; var groupName = fieldsGroup.groupName; var columnsGroup = columnsGroups[groupName]; if (!columnsGroup) { columnsGroup = columnsGroups[groupName] = {}; } var fields = fieldsGroup.fields; for (var j = 0; j < fields.length; j++) { var fieldInfo = fields[j]; columnsGroup[fieldInfo.field] = createColumnAttributes(j, field.isActive); } } return columnsGroups; }
يكون الاختيار المرئي أكثر بساطة ، وتساعد بيئات التطوير الحديثة والمحررين من خلال إبراز المواد الفرعية في أجزاء مختلفة من الشفرة.
function updateActiveColumnsSetting(fieldsGroups) { var columnsGroups = {}; for (var i = 0; i < fieldsGroups.length; i++) { var fieldsGroup = fieldsGroups[i]; var groupName = fieldsGroup.groupName; var columnsGroup = columnsGroups[groupName]; if (!columnsGroup) { columnsGroup = columnsGroups[groupName] = {}; } var fields = fieldsGroup.fields; for (var j = 0; j < fields.length; j++) { var fieldInfo = fields[j]; columnsGroup[fieldInfo.field] = createColumnAttributes(j, field.isActive); } } return columnsGroups; }
القاعدة 4. مجموعة الكتل وفقا للمعنى.نستخدم التأثير النفسي للإدراك - "تأثير القرب": يتم الجمع بين الأرقام متباعدة عن كثب في الإدراك. لإعداد التعليمات البرمجية للتحليل والتعميم في عملية الإدراك ، ولتقليل كمية المعلومات المخزنة في الذاكرة ، يمكنك ترتيب صف بجانب بعضها البعض ، متحدًا بمعنى أو وثيق في الوظيفة ، بتقسيمها بخط فارغ.
إلى:
foreach(var abcFactInfo in abcFactInfos) { var currentFact = abcInfoManager.GetFact(abcFactInfo); var percentage = GetPercentage(summaryFact, currentFact); abcInfoManager.SetPercentage(abcFactInfo, percentage); accumPercentage += percentage; abcInfoManager.SetAccumulatedPercentage(abcFactInfo, accumPercentage); var category = GetAbcCategory(accumPercentage, categoryDictionary); abcInfoManager.SetCategory(abcFactInfo, category); }
بعد:
foreach (var abcFactInfo in abcFactInfos) { var currentFact = abcInfoManager.GetFact (abcFactInfo); var percentage = GetPercentage(summaryFact, currentFact); accumPercentage += percentage; var category = GetAbcCategory(accumPercentage, categoryDictionary); abcInfoManager.SetPercentage(abcFactInfo, percentage); abcInfoManager.SetAccumulatedPercentage(abcFactInfo, accumPercentage); abcInfoManager.SetCategory(abcFactInfo, category); }
في المثال العلوي ، هناك 7 كتل ، في 3 السفلي: الحصول على القيم ، تتراكم في حلقة ، وتحديد خصائص مدير.
المسافة البادئة جيدة لتحديد الأماكن التي تستحق الاهتمام بها. لذلك ، الخطوط
accumPercentage += percentage; var category = GetAbcCategory(accumPercentage, categoryDictionary);
بالإضافة إلى الاعتماد على العمليات الحسابية السابقة ، فإنها تتراكم القيم في المتغير cumulatedPercentage. للتأكيد على الاختلافات ، يتم وضع مسافة بادئة للرمز.
إحدى حالات الاستخدام المعينة للقاعدة هي إعلان المتغيرات المحلية على مقربة من مكان الاستخدام قدر الإمكان.
المادة 5. اتباع مبدأ تفرد المسؤولية.هذا هو أول مبادئ SOLID في OOP ، ولكن بالإضافة إلى الفئات ، يمكن تطبيقه على المشاريع أو الوحدات النمطية أو الوظائف أو مجموعات الكود أو فرق المشروع أو المطورين الفرديين. عند سؤال من أو عن المسؤول عن هذه المنطقة ، يتضح على الفور من أو من. اتصال واحد دائما بسيط. يتم تعميم كل فصل لمفهوم واحد ، عبارة ، استعارة. نتيجة لذلك ، أقل من أن نتذكر ، عملية الإدراك أسهل وأكثر فعالية.
في الختام ، مثال شامل:
private PartnerState GetPartnerStateForUpdate( PartnerActivityInfo partner, Dictionary<int, PartnerState> currentStates, Dictionary<int, PartnerState> prevStates) { PartnerState updatingState; if (prevStates.ContainsKey(partner.id)) { if (currentStates.ContainsKey(partner.id)) { var prevState = prevStates[partner.id]; updatingState = currentStates[partner.id]; // 1 } else { // 2 } } else if (currentStates.ContainsKey(partner.id)) { updatingState = currentStates[partner.id]; } else { throw new Exception(string.Format(" {0} {1}", partner.id, month)); } return updatingState; }
بعد استبدال مفهرسي ContainsKe ، قلب المتفرعة ، تحديد الطريقة ، وتقليل مستويات التعشيش ، اتضح أنه:
private PartnerState GetPartnerStateForUpdate( PartnerActivityInfo partner, Dictionary<int, PartnerState> currentStates, Dictionary<int, PartnerState> prevStates) { PartnerState currentState = null; PartnerState prevState = null; prevStates.TryGetValue(partner.id, out prevState); currentStates.TryGetValue(partner.id, out currentState); currentState = CombineStates(currentState, prevState); return currentState; } private PartnerState CombineStates( PartnerState currentState, PartnerState prevState) { if (currentState == null && prevState == null) { throw new Exception(string.Format( " {0} {1}" , partner.id, month)); } if (currentState == null) { // 1 } else if (prevState != null) { // } return currentState; }
الوظيفة الأولى هي المسؤولة عن الحصول على الدول من القواميس ، والثانية عن دمجها في واحدة جديدة.
القواعد المقدمة بسيطة ، لكنها مجتمعة توفر أداة قوية لتبسيط الكود وتقليل حمل الذاكرة أثناء عملية التطوير. لن تتمكن دائمًا من متابعتها ، ولكن إذا أدركت أنك لا تفهم الكود ، فمن الأسهل أن تبدأ به. لقد ساعدوا المؤلف بشكل متكرر في أصعب الحالات.