نقض اصل SRP ؟

پرسیده شده
فعالیت 929 روز پیش
دیده شده 395 بار
0

سلام خسته نباشید

 

ببخشید توی متد store اومدیم هم create کردیم هم تصویر اپلود کردیم و هم update کردیم . میخواستم بدونم اصل تک مسئولیتی نقض نشده ؟ 

 

من اومدم متد اپدیت رو پاک کردم و مستقیم با متد create نوشتمش ، درست و غلطش رو بهم بگید لطفا . مخصوصا روشی که اخرین ایدی رو گرفتم . 

 

public function store (AddProductRequest $request)
    {

        $validData = $request->validated();
        $admin = User::where('role' , 'admin')->first();

		
        $lastId  = $this->products->max('id');
 
        try {
        
            $basePath = 'products/' . ($lastId + 1) . '/'  ;
            $sourceImagePath = $basePath . 'source_url' . '_' . $validData['source_url']->getClientOriginalName();
            
            $images = [
                'demo_url'      => $validData['demo_url'],
                'thumbnail_url' => $validData['thumbnail_url'],
            ];
            $imagesPath = ImageUploader::multiUploader($images, $basePath);
            ImageUploader::upload($sourceImagePath, $validData['source_url'], 'local_storage');
   

            $addResult = Product::create([
                'title'         => $validData['title'],
                'price'         => $validData['price'],
                'description'   => $validData['description'],
                'category_id'   => $validData['category_id'],
                'demo_url'      => $imagesPath['demo_url'],
                'thumbnail_url' => $imagesPath['thumbnail_url'],
                'source_url'    => $sourceImagePath,
                'owner_id'      => $admin->id,
                ]);

                if (!$addResult) {
                    return back()->with('failed', 'محصول اضافه نشد');
                }
                
            return back()->with('success', ' محصول اضافه شد');

        } catch (\Exception $e) {

            return back()->with('failed',$e->getMessage());
        }
     
       
    }
فایل پیوست

هادی قاسمی
هادی قاسمی

8 مهر 00

0
حذف شده

اول بزارید اصلا اینو بگم که ما چه جوری متوجه میشیم که یک کلاس اصل SRP رو رعایت نکرده

 

 

۱ - 

اولیش اینکه کلاس ما instance variable های زیادی داشته باشه، اگه کلاسی دارید که داخل شما instance variable های زیادی دارید این نشون میده که شما دارید SRP رو دارید نقص میکنید

 

۲ -

تعداد public متدهای زیاد باشه داخل یک کلاس، چون که متدهای public یک کلاس در حقیقت APIهای اون کلاسن و نشون میده که این کلاس داره کارهای زیادی رو انجام میده(این مورد خیلی مهمه)

 

 

۳ - 

مورد سوم اینکه شما داخل متدهایی که داخل کلاستون دارید باز دارید از instance variable های زیادی استفاده میکنید (تایید کننده ۲ مورد بالا)

 

۴ - مورد آخر اینکه شما یه سری کارهای بی ربط و خاص رو بسپارید به متد های private اون کلاس، ینی چی؟

ببینید شما فرض کنید که یک کلاس دارید که دارید باهاش شفاراشاتون رو مدیریت میکنید بعدش بیایید بگید که خب بزار من یه متد private هم تعریف کنم تا برام لاگ این سفارش رو بندازه که این مورد دوباره این اصل رو نقص میکنه

 

 

 

روشی که دارید برای ذخیره فایل های آپلود شده استفاده میکنید زیاد پایدار نمیتونه باشه، نگران query آپدیت نباشید چون فقط اون یک ستون خاص رو آپدیت میکنه ن کل رکورد رو 

 

فایل پیوست

امیر صالحی

توسط

امیر صالحی

10 مهر 00

حذف شده
خیلی ممنون . فقط برای نکته اول منظور شما اینه مه از کلاس های دیگه ، تعداد زیادی new گرفته باشیم و شی ساخته باشیم درسته ؟ تعداد زیاد حدودی ینی چنتا ؟ مثلا توی کلاسی که product اضافه میکنیم توی این پروژه چندین بار پیش اومد که از مدل product بصورت استاتیک متد صدا زدیم ، اینجا مربوط میشه به نکته اولی که گفتید ؟
هادی قاسمی

11 مهر 00

0
حذف شده

سلام و احترام 

الان آیدی محصولی که دارید ذخیره میکنید برای تصاویر که آخرین آیدی هم هستش اشتباهه چون هنوز محصول شما insert نشده که id رو داشته باشید، داخل کدتون هم یه + 1 با آیدی آخرین محصول ثبت شده هم دیدم که این میتونه درد سر ساز بشه بعدا و یه سری اشتباهات به وجود بیاد که تصویر برای یه محصول دیگه بشه، اول تصویر رو ذخیره و بعد از اینکه شما آیدیش رو در آختیار دارید تصاویر رو براش insert کنید

میتونید از تابع firstOrCreate استفاده کنید برای اینکه اگه همون محصول از قبل ثبت شده بود دیگه insertش نکنه و به جاش اون محصول رو return کنه

توی جلسات بعدی این بخش آپلود تصویر رو یه تابع جدا میکنیم که کار آپلود کردن تصویر برای store و update رو انجام بده و ما فقط درون متد store و update صداش میکنیم تا برامون این کار رو انجام بده

 

فایل پیوست

امیر صالحی

توسط

امیر صالحی

9 مهر 00

حذف شده
سلام ممنونم . اون قسمت که ایدی رو به علاوه یک کردم ، در واقع دارم بزرگترین ایدی که هست رو میگیرم و چون هنوز ایدی جدید insert نشده , بعلاوه یکش میکنم . اینکار برای حذف اون کوئری اپدیت بود . راه بهینه تر چی میتونه باشه ؟ چون فکر میکنم دوتا کوئری داره انجامش سرعت میاد پایین . چقد فکرم درسته ؟
هادی قاسمی

9 مهر 00