Jump to content
php.lv forumi

PHP programmētāja vakances Draugiem.lv grupas uzņēmumā Mapon


andrisp

Recommended Posts

Nu ja tā nopietni domā par tieši to kodu ne konkrēto piemēru ar static call, tad viss tas kods ir tāds diezgan pabriesmīgs... Kāda velna pēc vispār vienai konsoles komandai būtu vajadzīgi N entrypointi. SRP or naah? Un ja jau konsoles handleris vienalga tiek reģistrēts kaut kā, tad nafig nepadot jau instanci kas implementē kaut kādu komandas interfeisu?

 

 

Sentence: rm -rf un composer install symfony/console...

Edited by F3llony
Link to comment
Share on other sites

  • Replies 79
  • Created
  • Last Reply

Top Posters In This Topic

Kāda velna pēc vispār vienai konsoles komandai būtu vajadzīgi N entrypointi.

? Kur tur ir N entrypointi?

 

Un ja jau konsoles handleris vienalga tiek reģistrēts kaut kā, tad nafig nepadot jau instanci kas implementē kaut kādu komandas interfeisu?

Because this is way simpler. Priekš kam tu tur kaut kādu interfeisu gribi iebāzt? Ko tas interfeiss REĀLI uzlabos?

 

Sentence: rm -rf un composer install symfony/console...

Yep, 10k lines of code for what I could do with 10.

Link to comment
Share on other sites

Manuprāt, call_user_func() FTW. Un listMethods() vietā vajadzētu reflection, kurš atfiltrē metodes, kuras sākas ar handler (handlerFoo(), handlerBoo()).

call_user_func() ir lēnāks, kaut dara to pašu. Reflection ir vēl lēnāks, un filtrēšana ir VĒL lēnāka. Priekš kam to visu darīt, ja rezultāts ir identisks?

Link to comment
Share on other sites

Jurchik, izskaidro šito

 

kaksis.png

Ja tu izlasītu visu metodi, tad pamanītu, ka ir iespējams piereģistrēt kā konsoles handleri arī parastu funkciju, i.e.:

App::registerConsoleHandler('var_dump', 'dumpThis');


`php index.php dumpThis arg1 arg2 arg3`
Edited by jurchiks
Link to comment
Share on other sites

Yep, 10k lines of code for what I could do with 10.

Tīri vispārīgi, ne par šo gadījumu (jo šeit mērķis ir pašam savu konsoli uztaisīt) - ja tā ir viena komanda un pēc tās izpildes gatavs konsoles supports, why not? Šodien taču neviens neskaita diska vietu un tā tālāk. Bet vēlreiz - protams, ja mērķis ir uztaisīt pašam savu, tad jā. Man, piemēram, tāda mērķa nav un es nedomājot ielikšu gatavu konsoli un, visai ticams, nekad neskatīšos tajās 10k rindās, jo risināšu citus uzdevumus.

 

Kāpēc to gribu teikt. Vēlreiz un vēlreiz - apkārt viss mainās, un jāiet līdzi. Man pašam nepatīk (vai nepatika) tas composer, jo ir WTF, es varu taču uztaisīt download, unzip un iekopēt vajadzīgajā direktorijā, bez visādiem tur lock failiem, dependensijiem, utt. Pieņemsim, ka šis izdodas sekmīgi, tāpēc  sāku ignorēt arī citus pavērsienus un, skat – esmu jau īpatnis ar irrelevantām zināšanām, kura projekti virzās tik lēni, ka nevienu tas neinteresē.

Edited by Mr.Key
Link to comment
Share on other sites

Man nav iebildumu pret composer, bet ir iebildumi pret masīviem projektiem, kuri dara būtībā vienkāršas lietas. Fancy features aside, tur nekā tāda nav, un lielāko daļu to fīču nevienam arī nevajag.

Es esmu ieinteresēts uztaisīt tikai absolūto minimumu, un pārējo jau var labot/likt klāt pa savam atkarībā no nepieciešamības.

Edited by jurchiks
Link to comment
Share on other sites

... Diez jams kādreiz sapratīs, ka visas tās komponentes ir pamatā pilnīgi decoupled un tas, ka tur ir 10k lines of code nenozīmē, ka visas jamas ir jāizmanto? Piemēram, vienkāršai konsoles app vajag ko? Input, Output un Application. Application pati salasa komandas vai jamas manuāli piereģistrē iekš šā, tur ir option un argument parser, un viss. Tajā pašā laikā visa komponente nespiež nevienu no daļām īsti izmantot un pie reizes atrisina problēmu ar komandrindas parsēšanu un help ģenerēšanu. Tik sasodīti vienkāršs dīls un noklāts ar testiem, so var būt drošs, ka nekas nepabruks.

 

Tajā pat laikā, es vēl atceros laikus kad es arī gribēju visus riteņus pats pārrakstīt. Tas gan bija pirms gadiem 10 un beidzās līdz ar brīdi, kad atklājās, ka darot kaut ko produktīvi par to var saņemt pieklājīgu samaksu :DD

Link to comment
Share on other sites

>var būt drošs, ka nekas nepabruks.

Ok, kas manā kodā var pabrukt? Tur reāli koda ir tik maz, ka nekas nevar nobrukt. Tajā Symfony konsolē ir tik daudz koda, ka visus bagus nevar izķert.

 

+ vēl ir tāda štelle, ka ir daudzreiz ātrāk 5 minūtēs uzdrukāt šādu primitīvu kodu, kurš dara visu, ko vajag, un par kuru tu automātiski zini visu, ko vajag zināt, nekā nokačāt symfony konsoli un tad pusstundu studēt, kā panākt visu, ko tev vajag izdarīt.

Edited by jurchiks
Link to comment
Share on other sites

:D tu uz tā sava koda cyclomatic complexity esi paskatījies? Es esmu diezgan drošs vismaz viens 5inieks Tev tur toč atradīsies.

  • Tev nav testu. Izmaiņas kodā var izraisīt kaut kādus side-effects par kuriem Tu nezini. Nepatīk PHPUnit? Izmēģini PHPSpec, vismaz;
  • Symfony konsole ir burtiski noklāta ar testiem, no A-Z;
  • Symfony konsolei ir visaptveroša dokumentācija;
Edited by F3llony
Link to comment
Share on other sites

>tu uz tā sava koda cyclomatic complexity esi paskatījies?
Un tavs kods ir labāks?
 
>Tev nav testu
Jau atrunāts.
 
>Symfony konsole ir burtiski noklāta ar testiem, no A-Z;
Tas nenozīmē, ka tur nav neviena baga.
 
>Symfony konsolei ir visaptveroša dokumentācija
kura prasa daudz laika, lai iemācītos vienkāršas lietas
 
>SOLID Tavā brūvējumā ir pilnībā noignorēts
Ne pilnībā. Maintainability is not a problem because there's so little code. Symfony maintainot gan ir "jautri".
 
>Tev ir nulle dokumentācijas whatsoever.
Tāpēc, ka kods ir self-explanatory.
 
>Arī kods pats sevi nepaskaidro ne cik labi.
Piemēram (ja neskaita šo konsoles handlera reģistrāciju, kurai gan ir usage piemērs)? Un te neiet runa par internal API, kuru end useris neredz, tā kā to tu uzreiz vari aizmirst.
Es uzskatu, ka koda piemēri ir daudz vērtīgāki par dokumentāciju. Ja ir kaut kādi baigi daudzie varianti, ko kādam API var padot, tad var vēl blakus piemēram komentāru bloku uzrakstīt, bet ne vairāk.
 
>Tavs 5 minūšu garbage, kas makes sense tikai Tev pašam...
Mans 5 minūšu "garbage" ir saprotams max 1 minūtes laikā, ja prot lasīt kodu.
 
>Šeit ir sample komanda
Priekš konsoles komandas, kas izvada "Hi there, world!", tas ir daudz par daudz koda.
 
Turklāt tai Symfony console struktūrā, vienai komandai obligāti nepieciešama vesela klase ar vairākām metodēm. Manā gadījumā 1 klasē var būt jebkāds skaits komandu, katrai sava metode.

Un vēl ir tāds feins punkts, ka Symfony konsolei vajag uztaisīt objektu katrai konsoles handlera klasei tikai lai uzzinātu, kādu komandu tā handlo.

Es jebkurā brīdī varu pierakstīt ConsoleHandler klasei klāt metodi ar, piemēram, šādu API:
 

protected static final function validateArguments(array $arguments, ArgumentDefinition ... $definitions): bool
{
    // loop through $definitions, validate against $arguments
}

pielietot to, piemēram, šādi:
 

use \simpleframe\ConsoleHandler;
use \simpleframe\console\ArgumentDefinition as AD;

class MyConsoleHandler extends ConsoleHandler
{
    public static function command(...$arguments)
    {
        if (!self::validateArguments($arguments, AD::stringArgument(), AD::intArgument()->optional()))
        {
            echo 'Usage: php index.php command stringArgument[, intArgument]', PHP_EOL;
            return;
        }
    }
}

  
un arī tad manā kodā viss būs īsāk.

 

Ja nu man nenormāli gribētos named parameters, tad var uztaisīt `protected static final function parseArguments(array $arguments, ParameterDefinition ... $definitions): array`, kas samapo uz nosaukumiem, kuri padodas, piemēram, `AD::stringArgument('name goes here')`. Optional argumentiem value būtu vienkārši null.

 

Tas viss ir elementāri un ātri uztaisāms un notestējams, un tur būtu ļoti maz koda.

Edited by jurchiks
Link to comment
Share on other sites

Guest
This topic is now closed to further replies.

×
×
  • Create New...