تحدي الكود النظيف في بايثون

مرحبا بالجميع اتمنى انكم بخير :wave:

ذكرنا في جلسة أساسيات و قواعد الكود النظيف في بايثون بأننا سنعمل تحدي للمشاركين وها قد بدأ التحدي :star_struck:.

دعنا نتعرف على التحدي

مهمتك هي جعل هذا الكود أنظف بناءاً على ماتعلمناه في الجلسة.

class ATM:

    def __init__(self, balance, bank_name):
        self.balance = balance
        self.bank_name = bank_name

    def withdraw(self, request):
        print("current balance =" , self.balance, "your request =", request)
        result = self.balance

        if request > self.balance:
            print("Can't give you all this money !!")

        elif request < 0:
            print("More than zero plz!")

        else:
            self.balance -= request

            while request > 0:




                if request >= 100:
                    request -= 100
                    print("give 100")

                elif request >= 50:
                    request -= 50
                    print("give 50")

                elif request >= 10:
                    request -= 10
                    print("give 10")

                elif request >= 5:
                    request -= 5
                    print("give 5")

                elif request >= 1:
                    print("give 1")
                    request = 0

            result = self.balance - request

        return result
balance1 = 500
balance2 = 1000

atm1 = ATM(balance1, "Saba Bank")
print("Welcome to Saba Bank")
atm2 = ATM(balance2, "Jeen Bank")
print("Welcome to Jeen Bank")

atm1.withdraw(700)
atm1.withdraw(421)
atm1.withdraw(82)

atm2.withdraw(500)
atm2.withdraw(450)
atm2.withdraw(51)

مدة التحدي هي يومين وسنقوم بنشر الحل النموذجي بعد انتهاء المدة.

** وقت تسليم الحلول**

وقت تسليم الحلول بعد يوم 14 أكتوبر الساعة 10 مساء بتوقيت مكة المكرمة UTC+3، للإطلاع على التوقيت https://time.is/UTC+3

كيفية تسليم الحلول

يمكنك تسليم الحلول مباشرة في التعليقات.

5 Likes

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

class ATM:

    def __init__(self, balance, bank_name):
        self.balance = balance
        self.bank_name = bank_name
        self.cache_categories = [100, 50, 10, 5, 1]

    def withdraw(self, request):
        print("current balance = ", self.balance, "- your request = ", request)
        result = self.balance
        self.check_balance(request)

        return result

    def check_balance(self, request):
        if request > self.balance:
            print("Can't give you all this money!!")

        elif request < 0:
            print("More than zero plz!")

        else:
            self.balance -= request
            self.give_cache_category(request)

        return self.balance

    def give_cache_category(self, request):
        for cache_category in self.cache_categories:
            while request >= cache_category:
                request -= cache_category
                print("give " + str(cache_category))

        return self.balance


balance1 = 500
balance2 = 1000

saba = ATM(balance1, "Saba Bank")
print("Welcome to " + saba.bank_name)
jeen = ATM(balance2, "Jeen Bank")
print("Welcome to " + jeen.bank_name)

saba.withdraw(700)
saba.withdraw(421)
saba.withdraw(82)

jeen.withdraw(500)
jeen.withdraw(450)
jeen.withdraw(51)

3 Likes

أخفيت غسول الديتول من أجل ما نخرب المتعة تبع التحدي، وكل واحد يشارك بحله بدون ما يشوف الحلول السابقة :grin:

@L.Da
@zaqoutabed

وقت تسليم الحلول يوم 14 أكتوبر الساعة 10 مساء بتوقيت مكة المكرمة UTC+3، للإطلاع على التوقيت https://time.is/UTC+3

2 Likes

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

2 Likes

لا ابدا لا داعي للإعتذار نحن من يجب من نعتذر لأننا لم نوضح وقت التسليم :sweat_smile:

وأيضا الاشتراك بالمسابقة مفتوح للجميع ليس فقط لمن سجل…

نتمنى لك الشفاء العاجل… شفاءً لا يغادر سقما :pray:

آمين ويحقق كل أمنياتك بإذن الله :pray:


  • بالمناسبة، كالعادة حلك مثالي :ok_hand:
2 Likes

شكرا لكم أستاذ.

2 Likes

تعديل لكود سابق :face_with_hand_over_mouth:

class ATM:

    def __init__(self, balance, bank_name):
        self.balance = balance
        self.bank_name = bank_name
        self.lookup_change = {"100": 100, "50": 50, "10": 10, "5": 5, "1": 1}

    @property
    def balance(self):
        return self._balance

    @balance.setter
    def balance(self, balance):
        if balance < 0:
            raise Exception("Balance must be greater than zero")
        self._balance = balance

    @property
    def bank_name(self):
        return self._bank_name

    @bank_name.setter
    def bank_name(self, bank_name):
        if not bank_name:
            raise Exception("bank name cannot be empty")
        self._bank_name = bank_name
        print("Welcome to {}".format(bank_name.title()))

    def withdraw(self, request):
        print("Current balance = {} and your request = {}".format(self.balance, request))

        if self.is_valid_request(request):
            self.make_payments(request)
            self.balance -= request

        return self.balance

    def make_payments(self, request):

        def payment_proccess(request, decrement_value):
            request -= decrement_value
            print("give {}".format(decrement_value))
            return request

        while request > 0:
            if request >= self.lookup_change['100']:
                request = payment_proccess(request, self.lookup_change['100'])

            elif request >= self.lookup_change['50']:
                request = payment_proccess(request, self.lookup_change['50'])

            elif request >= self.lookup_change['10']:
                request = payment_proccess(request, self.lookup_change['10'])

            elif request >= self.lookup_change['5']:
                request = payment_proccess(request, self.lookup_change['5'])

            elif request >= self.lookup_change['1']:
                payment_proccess(request, self.lookup_change['1'])
                request = 0

    def is_valid_request(self, request):
        if request > self.balance:
            print("Can't give you all this money !!")
            return False

        if request < 0:
            print("More than zero plz!")
            return False

        return True


balance1 = 500
atm1 = ATM(balance1, "Saba Bank")
atm1.withdraw(500)
atm1.withdraw(450)
atm1.withdraw(51)

balance2 = 1002
atm2 = ATM(balance2, "Jeen Bank")

atm2.withdraw(500)
atm2.withdraw(450)
atm2.withdraw(51)
3 Likes

عمل ممتاز يالارا الكود نظيف جدا :ok_hand:

3 Likes

عمل ممتاز عبد الله بس عندي ملاحظة بسيطة من الافضل ان تضع هذه الدالة payment_proccess خارج دالة make_payments

في بايثون هناك تسمية متعارف عليها للدوال الداخلية التي تقوم بوظيفة لدالة اخرى ولا يتم استدعاءها وهو اضافة شرطة سفلية قبل اسم لدالة بهذا الشكل _payment_proccess.

غير ذلك عمل ممتاز احسنت :ok_hand:

4 Likes

شكرا لكم أستاذ أحمد🌷.

3 Likes