[Homework] PHP Basics - Flow-Control - November 2014
Виждам, че няма такава тема още, така че я пускам. Ето моето домашно. Критики и съвети добре дошли!
Виждам, че няма такава тема още, така че я пускам. Ето моето домашно. Критики и съвети добре дошли!
Много ми харесва, че си се ориентирал с дейттайм функциите и си приложил някаква нелоша абстракция.
Лошото е, че абстракцията не винаги е правилна, що се отнася до смесването й с темплейта.
За целите на домашното всичко е ОК, даже нещата са направени доста по-хитро от колкото най-вероятно измислящия задачата е очаквал. Аз от своя страна ще изложа няколко забележки, като дам примери от реалния живот свързан с уеб програмиране.
Обикновено в една добра фирма човекът, който пише логиката не е същия, като човекът, който прави дизайна. Сега ако поискам всички клетки да са с черен бекграунд не е толкова трудно. Ще влезе съответния дизайнер, ще намери клетките и ще им сложи един класс и после ще го опише в ЦСС-а. Или просто ще го опише в CSS-а за всяка клетка.
Рейзва обаче проблем, какво ще стане ако поискам клетките само за Март, Октомви и Ноември да са червени? Тогава дизайнер няма как да го направи и ще стане дабъл уърк. Ще отидеш в кода и ще напишеш някакъв IF за тези месеци, да сложи някакъв клас. Първо, че кодът ще започне да изглежда много по-зле, второ че и двамата ще трябва да правите нещо по въпроса.
От друга страна, представи си, че всъщност не трябва да листваш всички месеци, а само определени?
Направих едно примерно рефакториране на задачката ти AnnualExpenses
Пак съм вкарал известен левел на абстракция. Месеците не съм ги изкарал в HTML-а, а ги генерирам в масив, за да знаем бройката му. Не е много правилно и това, но за да не хардкодвам после 4 в цикъла, го направих по този начин, иначе според мен би било най-добре да се знае с каква бройка се работи и да не е динамично генерирана, но съм оставил и тази вратичка.
Както можеш да видиш от кода не са нужни никакви сложни логики за да се генерира HTML-а, още по-малко пък функци якоято да създава стринг от HTML. Така, ако решите, че ви трябва Декември месец, ще го добавите в масива на getMonths() функцията.
Ако решите, че November трябва да е нормален месец, а не оцветен, дизайнерът ще влезе и ще промени класа на normalMonth
Много си мислих дали да не бутна един switch и аз за последната ама ми се струваше малко грозно в case да набутам операции и си писах elseif-ове. И понеже не го пробвах, а само си го помислих, не разбрах дали наистина ще е така. Сега виждам, че със switch определено е по-добрият вариант според мен.
Въпрос на вкус е може би - на мен със switch ми изглежда по-прегледно :)
Здравейте,
и аз успях с домашните от тази тема...Ето и линк към кода:https://github.com/JuliaFS/PHP-basics/tree/master/PHPflowControl
Ще се радвам на всякакви препоръки, с PHP тръгвам от нулата и предполагам че всякакви коментари биха ми били полезни. Като цяло с програмиране се занимавам отскоро, та приемам препоръки и по самите идеи за решения на задачите и евентуални оптимизации...
Имаш много приятни решения на някои от задачите :)
Освен това видях някои полезни функции, които не съм се сетил да ползвам - array_sum, array_rand и strrev...
Единствено може да пооправиш индентацията на кода на AnnualExpenses.php в tbody-то.
Благодаря :)))
ами всичко е по W3C-то, за всяко нещо ровех как се прави, щот нищо не знам :))) То тук май си има функция за всичко...
Но не разбрах...какво точно да се поправи по задачата с разходите...в смисъл месеците да не са хардкоднати ли?
Не, не, табулация сложи малко на кода в tbody-то - има вложени for-ове, имаш td-та - аз бих ги вкарал една табулация навътре :) Всичко друго си е наред :)
И аз съм готов с тези задачи - линк.
ПС: Постваме задачите си тук за да обсъждаме решенията си - не да се хвалим колко програмираме. Нужно ли е изрично да твърдим, че приемаме критики/препоръки? :)))
Да запълня малко редове, че да пусна тема с един ред в нея малко тъпо :D
Направи ми впечатление, защото във всеки пост го виждам. Иначе да - запълва място. :D
Ето и моето домашно Github
С PHP за пръв път се сблъсках преди 2 седмици, когато започна този курс, така че всякакви препоръки са добре дошли.
На 6 задача за проверката за палиндроми - взимате ли под внимание малките и големите букви? Защото в условието нищо не е казано и реално може човек да си го тълкува както иска. Примерно "ohho" и "Ohho" - при case-sensiteve проверка второто не е палиндром.
Според мен трябва да има и case-sensitive проверка, но ми е любопитно и вие как сте го направили.
edit:
разликата за това дали проверката за палиндромите да е case-sensitive или не, е в това да се ползУва strcmp или strcasecmp
Този палиндром пък никога нямаше да се сетя да го проверя по начина по който си го направил, хитро е.
Моето решение беше да сравнявам буквите от двете страни на стринга дали са еднакви, т.е. Ohho ще върне, че не е палиндром. Но ако на функцията и се добави един допълнителен флаг за case sensitive проверка ще сработи както ти му кажеш.
function isPalindrome($param) { |
$count = 0; |
while ($count < floor(strlen($param / 2))) { |
if (substr($param, $count, 1) != substr($param, strlen($param) - $count - 1)) { |
return FALSE; |
} |
$count++; |
} |
return TRUE; |
} |
От къде да си изтегля домашното ? Линкът за това домашно при мен сочи към 3-тото домашно вместо към 4-тото.
от страницата на миналия курс можеш да си го дръпнеш, но е хубаво, когато излезе домашното за сегашния курса да ги провериш за разминавания, че големи куриози стават понякога :)
Росен, на първа задача няма нужда да слагаш проверка за even. Вместо това направи $i += 2. Аз лично предпочитам на задачите, в които искат да се изкарва нещо в browser да пиша семантичен html с всички задължителни тагове. Само на мен ли за 1-ва задача ми изкарва Total: 338.05 ?
Ето ги и моите задачи:
Как точно правиш закръглянето? Аз ползвам round и получавам точния резултат, като закръглям самите корени, преди да ги добавя към сумата. Предполагам ти ги закръгляш при самото отпечатване, като правиш същото и за сумата.
Да, закръглям ги само при отпечатването и използвам number_format() - http://php.net/manual/en/function.number-format.php
От това ще да е. При закръглянето се губят малко по малко някакви частици от числата, които ти добавяш в сумата и явно разликите се събират до 1 стотна.
Понеже видях, че в домашното примера не закръгля всички числа, разтърсих се за друга функция и затова ползвам round - така при 100 ми принтира 10, а не 10.00. Според мен именно тази функция са искали да ползваме.
Ето и моите решения - ЛИНК.
Все още повечето задачи ги правя в един файл - с php и internal styles, но предвид, че кодът не е кой знае колко не мисля, че е особен проблем. Не съм свикнал още да ползвам алтернативния синтаксис на циклите и условните конструкции, не ми е особено интуитивен, но има време до 14-ти, ще гледам да го направя. Засега всички елементи си ги добавям с echo, което малко ме дразни от естетическа гледна точка.
Ще се радвам да получа обратна връзка. Междувременно се връщам към тъпия CV Generator...
Фил, на 04.PrimesInRange във функцията isPrime не е необходима проверка за $num == 2. Ако $num e 2 изобщо няма да влезне в for цикъла и ще си върне true.
Аз на 4-та задача си пълня масив с всички числа, като ако числото е prime го слагам директно като стринг заедно със strong таг. По този начин накрая само 1 път принтирам tag и няма толкова презареждания. Направих и проверка дали са въведени цели числа и дали start < end.
Хм, прав си за двойката, малко автоматично го написах това. За целите числа също е добре да се провери. Ако второто е по-малко просто нищо няма да се случи, което е ОК като поведение.
Ще ги оправя тези неща, само да довърша CV генератора, че благодарение на тебе набих 150 реда JS за добавяне и махане на езици :D Просто безумна задача, да я бяха направили със звезда, а на нейно място 2-3 по-кратки задачки, по-добре щеше да е.
Рефакторирането наистина е доста добро и дори обмислям да го променя и в моя код, определено ще стане доста по-гъвкаво. Съгласен съм, че би създал проблеми този код извън домашното. И няма да е зле като цяло, когато пиша задачите си да мисля не само за текущия случай, както съм направил, ами и за тези, които например ти ми каза сега. Благодаря много за съветите :)