Duplicazione del codice dopo l'iniezione delle dipendenze anziché l'ereditarietà

0

Sto applicando l'Iniezione di Dipendenza anziché l'Ereditarietà. Ma ora ho il problema della duplicazione del codice .

Main Controller

final class PreferenceController implements PreferenceInterface
{
    protected $preferenceRepository;

     /**
     * PreferenceController constructor.
     * @param PreferenceRepository $preferenceRepository
     */
    public function __construct(PreferenceRepository $preferenceRepository)
    {
        $this->preferenceRepository = $preferenceRepository;
    }

    public function user(Request $request)
    {
        return response()->json($this->preferenceRepository->getByUser($request->attributes->get('user')));
    }

    public function save(Request $request, array $data)
    {
        return response()->json($this->preferenceRepository->saveByUser(
        $request->attributes->get('user'), $data));
    }
}

Esempio 1 con delega

final class CategoryPreferenceController implements PreferenceInterface
{
    private $preferenceController;

    public function __construct(PreferenceController $preferenceController)
    {
        $this->preferenceController = $preferenceController;
    }

    public function user(Request $request)
    {
        return $this->preferenceController->user($request);
    }

    public function save(CategoryPreferenceFormRequest $request)
    {
        return $this->preferenceController->save($request, $request->input('categories'));
    }
}

Esempio 2 con delega

class MailPreferenceController implements PreferenceInterface
{
    private $preferenceController;

    public function __construct(PreferenceController $preferenceController)
    {
        $this->preferenceController = $preferenceController;
    }

    public function user(Request $request)
    {
        return $this->preferenceController->user($request);
    }

    public function save(MailPreferenceFormRequest $request)
    {
        return $this->preferenceController->save($request, $request->all());
    }
}

Per essere più specifici ...

Come puoi vedere, ho reso il metodo save più specifico:

  • Richiedi parametro (PreferenceController) = > CategoryPreferenceFormRequest (CategoryPreferenceController)
  • Richiedi parametro (PreferenceController) = > MailPreferenceFormRequest (MailPreferenceController)

Qual è il problema?

Il constructor e il metodo user sono duplicati in entrambe le implementazioni.

Che cosa ho provato?

  • I posso ereditare CategoryPreferenceController e MailPreferenceController da PreferenceController, in questo modo:

    class PreferenceController
    {
        protected $preferenceRepository;
    
        /**
        * PreferenceController constructor.
        * @param PreferenceRepository $preferenceRepository
        */
        protected function __construct(PreferenceRepository $preferenceRepository)
        {
            $this->preferenceRepository = $preferenceRepository;
        }
    
        final protected function user(Request $request)
        {
            return response()->json($this->preferenceRepository->getByUser($request->attributes->get('user')));
        }
    
        final protected function handleSave(Request $request, array $data)
        {
            return response()->json($this->preferenceRepository->saveByUser(
            $request->attributes->get('user'), $data));
        }
    

    }

E nella classe figlio, chiamo il genitore handleSave :

public function save(CategoryPreferenceFormRequest $request)
{
    return $this->handleSave($request, $request->input('categories'));
}

Ma, penso che questa sia una brutta soluzione.

  • Non posso ereditare CategoryPreferenceController e MailPreferenceController da PreferenceController, perché il metodo save non ha la stessa dichiarazione
  • Non riesco a rendere astratto PreferenceController, perché questa classe è completamente implementata

Come evitare la duplicazione del codice in questo caso?

    
posta schellingerht 05.07.2016 - 08:32
fonte

0 risposte