سؤال

لدي وظيفة تتكون أساسًا من عدد هائل من الاستدعاءات (50+) لوظيفة أخرى تقوم بإدراج البيانات في مصفوفة، مع منطق هنا وهناك يفرض شروطًا مختلفة لإدراج عناصر مختلفة في المصفوفة (بالإضافة إلى القليل في النهاية الذي يكتب محتويات المصفوفة إلى ملف).أنا أتساءل عما إذا لم تكن هناك طريقة أفضل للقيام بهذه الوظيفة؛أفترض أنه يمكنني البدء بتقسيم مجموعات أوامر إدراج المصفوفة بشكل منطقي إلى وظائفها الخاصة، لكنني أتساءل عما إذا كان هناك المزيد الذي يمكنني القيام به.هل هناك؟

مثال:

function buildTable(fileName, data)
    local dataToWrite = {}
    table.insert(datTWrite, {
        Type = "type1",
        Key = "someKey",
        Value = data.SomethingInteresting
    })
    --and so on ad nauseum with an occasional but of actual logic to spice things up
    dataWriter:open(fileName .. ".bla")
    dataWriter:batchWrite(dataToWrite)
    dataWriter:close()
end

في هذه الحالة، dataWriter هو مثيل لفئة محددة مسبقًا تعالج عملية الكتابة إلى ملف.

هل كانت مفيدة؟

المحلول

والخبر السار هو أنك لم تدخل مباشرة في تشاؤم Lua الشائع المتمثل في تسلسل السلاسل إلى مخزن مؤقت في حلقة لبناء مخرجاتك.

سأكتب العينة الخاصة بك مثل هذا:

function buildTable(fileName, data)
    local t = {}
    t[#t+1] = {
        Type = "type1",
        Key = "someKey",
        Value = data.SomethingInteresting
    }
    --and so on ad nauseum with an occasional but of actual logic to spice things up
    dataWriter:open(fileName .. ".bla")
    dataWriter:batchWrite(t)
    dataWriter:close()
end

الذي يتمتع بميزة صغيرة تتمثل في عدم استخدام اسم طويل عرضة للأخطاء المطبعية للجدول المؤقت، ويستخدم t[#t+1] لغة لتوسيع جزء المصفوفة الذي يجب أن يكون أسرع من الاتصال table.insert().

وبخلاف ذلك، فإن مصدر أي تحسينات هيكلية سيكون في الجزء "وهكذا إلى الغثيان" من الكود.

  • ابحث هناك عن الحسابات والأجزاء الشائعة التي يمكن تجميعها في وظائف محلية.
  • تذكر أنه يمكنك دمج تعريفات الوظائف، بحيث يمكن تقييد الوظائف المساعدة في نطاق المكان الذي يتم استخدامها فيه.
  • ابحث عن المنطق الذكي للغاية، وأعد كتابته ليكون منطقيًا لمن سيتعين عليه الحفاظ عليه في العام المقبل.
  • ويكي: أنماط تصميم لوا
  • ويكي: زين لوا
  • ويكي: نصائح التحسين
  • ويكي: التنميط كود لوا

قبل كل شيء، احذر من التحسين المبكر.قم بقياس ما لديك الآن كنقطة للمقارنة، واستخدم ذلك كدليل للعثور على اختناقات الأداء.

نصائح أخرى

وبواسطة "وهلم جرا nauseum الإعلانية مع عرضية ولكن المنطق الفعلي لالتوابل الامور" أفترض أنك يعني ان لديك كتل كثيرة مثل:

table.insert(datTWrite, {
    Type = "type1",
    Key = "someKey",
    Value = data.SomethingInteresting
})

والجانب الوحيد من هذه فريدة من نوعها إلى وظيفة هو الجدول يتم ملؤه والكائن data. أن رأيي الشخصي "أفضل الممارسات" أن يكون لسحب كل ذلك للخروج الى جدول منفصل مثل:

local entries = {
    {
        Type = "type1",
        Key = "someKey",
        ValueField = "SomethingInteresting",
    },
    {
        Type = "type2",
        Key = "someOtherKey",
        ValueField = "SomethingElse",
    },
    -- etc.
}

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

for i, entry in ipairs(entries) do
    table.insert(datTWrite, {
        Type = entry.Type,
        Key = entry.Key,
        Value = data[entry.ValueField]
    })
end

لمنطق "عرضية"، يمكن لكل إدخال يكون لها وظيفة اختياري لإعطائك معلومات مثيرة للاهتمام في الحلقة. منها مثلا:

for i, entry in ipairs(entries) do
    if not entry.CheckSomething or entry.CheckSomething() then
        table.insert(datTWrite, {
            Type = entry.Type,
            Key = entry.Key,
            Value = data[entry.ValueField]
        })
    end
end

وبدلا من ذلك، هل يمكن أن تسمح حتى الإدخالات الفردية في الجدول أن تكون وظائف اذا كنت بحاجة الى مزيد من التفصيل. أن كل وظيفة دخول إرجاع الجدول (أو لا).

for i, entry in ipairs(entries) do
    if type(entry) == "function" then
        local newEntry = entry()
        if newEntry then
            table.insert(datTWrite, newEntry)
        end
    else
        table.insert(datTWrite, {
            Type = entry.Type,
            Key = entry.Key,
            Value = data[entry.ValueField]
        })
    end
end

وبدون أي شيء محدد على الذهاب، وأود أن محاولة البحث كود الروائح ونرى كيف يقارن الدالة. من الأصوات من الأشياء، هناك ربما الكثير بالنسبة لك أن تفعل. هل هناك كتل مماثلة كود / نسخ عزل المنطق المشروط مختلف؟ متداخلة الحلقات أو الشرطية؟ هذه هي بعض المنطلقات بسيطة عند محاولة تقسيم وظيفة الكبيرة إلى أجزاء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top