Професионална програма
Loading...
+ Нов въпрос
Valleri avatar Valleri 292 Точки

[Homework] КПК - Code Formatting

Здравейте,
ето моето домашно по първата ни тема: Homework

JavaScripta, PHP минаха леко, но на C# идея си нямам какво искаше да направи автора с тия торби с предмети иии попромених малко, не знам колко ще работи така де...
Има едно нещо в което се убедих, а преди се чудех "какво толкова?!" - Да използвам табове....в едитора изглежда добре, но като качих в хъба и излязоха разликите : )

8
C# OOP Advanced 10/12/2014 00:53:48
ZvetanIG avatar ZvetanIG 917 Точки

Здравей, Valleri

Мисля, че добре си се справил. Кода изглежда много добре. Това, което успях да видя, като забележка е в event.cs на ред 265 имаш излишен празен ред, който много вероятно да е от недоглеждане.

Ето и моето домашно.

7
Valleri avatar Valleri 292 Точки

cool Супер, мерси за забележката !

Относно твоето домашно, в Java имаш някои функции с фигурна скоба на долния ред, а на други на същия - сигурно знаеш, че трябва да е на същия.
Оставените public полета в events.cs мисля че се водят като грешка макар и не при форматирането специално, но като упражнение не е лошо да се огледа всичко.
Също така за Multidictionary i SortedBag предположих, че се има впредвид или generic dictionary (IDictionary) или просто Dictionary, а е multi защото съдържа 2 елемента или нещо такова.
За сортираната торба същата логика - мисля че става на въпрос за SortedSet.

Отново на c# кода - на 32-ри ред нищо, че имаш само по 1 statement трябва да сложиш скобки.
На 47-ми например и на няколко други места трябва да разделяш логически групите statements.
Инициализацията е друго от Append а той е различно действие от if ()

На PHP - на 2-ри ред е излишен този празен ред и отново разделяне на логическите блокове.

В Java - явно заради този проблем, който описах по-горе с табовете - на 36-37 ред всичко се е разместило, на 63-ти има някакъв висящ return.

1
24/09/2014 14:09:41
bsdemon avatar bsdemon 348 Точки

Цецо, 104 ред от collections.java, мисля че това цялото не е коментар, но може и да греша. 

0
ZvetanIG avatar ZvetanIG 917 Точки

Благодаря ви колеги, благодарение на коментарите ви пооправих още няколко неща.

Валери,
относно празните редове, много трудно е да кажеш дали е сложен правомерно или не. По тази причина се въздържах от коментар на твойте празни редове.  Ако ти виждаш една логика, аз може да виждам друга.  Особено ако кода не е наш и е изваден от някакъв контекс. Все пак ти благодаря. Някои от забележките наистина са уместни и ми помогнаха.

Илия,
не грешиш наистина това не е коментар.  Признавам, че в този код някой доста се е постарал и го е разбъркал доста дебилски.

0
nikola.m.nikolov avatar nikola.m.nikolov 832 Точки

Колеги, отместването в Java нали го правите с tab? Питането ми е защо при мен хем че в Eclipse отместването винаги го правя с tab след качването в github отместването се увеличава спрямо Eclipse? Пример: Тук

0
ZvetanIG avatar ZvetanIG 917 Точки

Отместването винаги се прави с tab, а един tab трябва да ти е равен на 4 празни символа. Виж в настойките на Eclipse да не са повече. Виж в Window -> Preferences ->Text Editor.

1
nikola.m.nikolov avatar nikola.m.nikolov 832 Точки

Сега ще погледна. Странното обаче е, че в Eclipse отместването е видимо по-малко отколкото след като се качи кода в github. 

Edit: в text editor настройката е: Displayed tab width: 4

Като се качва код в github някаде задава ли се езика, на който е писан кода?

0
24/09/2014 12:08:45
Yulia avatar Yulia 1342 Точки

Извинявам се за офф-топика, но не искам да правя нова тема за това. Аз започнах да пиша домашното днес и бях силно озадачена като видях, че даденият ни код нито се компилира, нито работи... и че изобщо е пълна измислица. Вярно, че домашното е на тема "форматиране на код", но ми се иска да вярвам, че задачата ни не е само да намерим клавишните комбинации в IDE-тата за това. Или греша? Защото по даденият код могат и трябва да се направят много други промени за да се нарече качествен - но това е невъзможно ако кодът е разни парчета от разни места - както изглежда, че е.

И отново да повдигна темата: как ще се оценяваме на тези домашни? Имате ли някакви идеи, искате ли да обсъдим това, да изравним критериите някак? Или да игнорираме темата и просто да добавим един много некачествен и не-работещ код към архивите си с домашни и да продължим да пишем "Браво, домашното е отлично написано"?

Извинявам се ако се изразих по-грубо от обичайно - КПК ми е любим курс и много искам наистина да е К.

Щом за другите домашни винаги се очаква да знаем много повече от преподаденото в темата, за да решим задачите, е логично и тук да е така, не е ли? Колко пъти за последните няколко месеца като минимум ни е казвано как да си именуваме променливите, методите? Колко още пъти трябва да се повтаря, че в JavaScript променливите се изнасят най-отгоре? Колко пъти ни бе повтаряно да избягваме повторения в кода? : ) 

С риск да не бъда по-критична от колкото трябва, хайде да синхронизираме заедно критериите за оценка на домашните

5
24/09/2014 23:40:45
bsdemon avatar bsdemon 348 Точки

 До някъде споделям мнението ти. Има моменти, примерно след някакъв коментар е вкаран код... От една страна може да си е коментар от друга може да се е получило от разместване на кода, как да процедираме ?

 Но ако кода който ни подават работи, IDE-то ще си го форматира само и почти е готово домашното.

Има много неясноти и като първи випуск, ние сме хората които ще трябва да изгладим нещата :)

 

0
Valleri avatar Valleri 292 Точки

Да, съгласен съм. Според мен трябва да е 'пълния пакет' КПК още от първото домашно, тоест както каза Юлия - променливи, повторение и т.н. НО проверяващия трябва да е достатъчно съобразителен да не ощети хората, които са избрали да направят само условието, защото не всеки е Монк и предмета може да не му допада чак толкова. 
В крайна сметка то си е за нас, ако решим да направим кода КПК от-до - печелим. Една добра дума в коментарите ще е оценката, иначе за точките няма смисъл...Ако някой ти каже че не си работил по условие като си изтрила функция която се повтаря, нямаме синдикат на пишещите домашни към, който да обжалваш. :) 
Иначе трябва да оглеждам и аз отсега за цялостно КПК на кода, това че не се компилира не мисля че пречи чак толкова.

1
ZvetanIG avatar ZvetanIG 917 Точки

Юле, напълно те подкрепям. 

Според мен при оценка на домашните трябва да се набляга на задължителните критерии, а неща които са двузначни да не се взимат предвит.  Например мястото на  {} е напълно ясно във всеки от езиците. А допълнителните празни редове как ще докажеш, че твойта логика за слагането им е по-правилна от тази на колегата. Тяхната цел е единствено да направят кода по четлив. И ако кода е такъв значи е постигнат нужния резултат.

Пак казвам, според мен трябва нещата, които са двузначни  да ги коментираме, но да не ги взимаме предвид в оценката. Особено ако кода е ясен и добре подреден.

1
25/09/2014 09:08:39
vdoynov avatar vdoynov 40 Точки

Да питам и аз нещо, леко offtopic, да не правя отделна тема.

Как се форматира string, който генерира SQL код? Става дума за MS Access и VBA програмиране. Дали има някакви правила?

Във VBA пренасяне на ред на string се прави с растояние и долна черта. Та кое е по-правилно според вас:

а)

sSQL = "UPDATE " & sTableName & _
" SET [LoadPositionColorR] = " & lRed & _
", [LoadPositionColorG] = " & lGreen & _
", [LoadPositionColorB] = " & lBlue & _
" WHERE [LabelID] = " & lNumber & ";"

б)

sSQL = "UPDATE " & sTableName & _
" SET [LoadPositionColorR] = " & lRed & ", [LoadPositionColorG] = " & lGreen & ", [LoadPositionColorB] = " & lBlue & " WHERE [LabelID] = " & lNumber & ";"

в) 

Нещо друго?

0
Yulia avatar Yulia 1342 Точки

Не знам VBA, но при заявки най-правилно е думичките UPDATE, SET, WHERE и т.н - от тях започва новият ред с табулация навътре. А ако самият ред е дълъг - отделните елементи на нов ред с още една табулация навътре. Тук в коментара не става много ясно май, но мисля че би било лесно четимо по този начин : )

sSQL = "UPDATE " & sTableName & _
            "SET [LoadPositionColorR] = " & lRed & ", _
                    [LoadPositionColorG] = " & lGreen & ", _
                    [LoadPositionColorB] = " & lBlue & _
           "WHERE [LabelID] = " & lNumber & ";"

2
25/09/2014 15:59:20
vdoynov avatar vdoynov 40 Точки

Е, ако има други идеи ще ми е интересно да ги прочета.

Юлия, за да сложиш нещата по този начин, без да започваш със запетайка трябва да изглежда така (използвам съм табулация, за да го направя):

http://pastebin.com/NXEiaP0u

На мен ми се струва, че така става по дървен за четене, а и писането излиза в повече.

1
RoYaL avatar RoYaL Trainer 6846 Точки

Ще се абстрахирам от странните символи, които виждам, защото MS Access ми е непонятен, но ако се водя от MySQL:

 

UPDATE

    table_name

SET

    column1 = "value1",

    column2 = "value2"

WHERE

    column3 = "xxx" AND

    column4 > 0 AND

    (

         column5 = "asd" OR

         column6 != "asd"

    ) AND

    column7 =

    (

         SELECT

             id

         FROM

             table_two AS tb1

         INNER JOIN

             table_three AS tb2

         ON

             tb2.id = tb1.tb2_id

         WHERE

              name = column6

         LIMIT 1

     )

 

UPDATE, SELECT, SET, WHERE, ON, JOIN, etc. започват на нов ред без индентация. Колоните са на нов ред с индентация - ако стойността е single value, колоната е последвана от равенство и стойността. Ако стойността е друг expression е последвана от равенство, на нов ред с интентация скоба, нов ред, интентация от скобата на вътре и експершъна, нов ред затварящ скобата на същото ниво на отварящата скоба. AND/OR condition-ите са на реда в който свършва експрешъна - при single value са след стойността, а когато е кеспрешън като показания - след затварящата скоба. " AND columnX = 'val' " е единична стойност, защото тя си връща съответната булева репрезентация. Същото и при " AND (columnX = 'val' OR columnY = 'val2') ". Експрешъна в скобите се еволюира до булева стойност, за това се взема за един и за това скобата е на нивото на column4 а самият експрешън е индентиран от скобите навътре.

Индентанциите реално играят ролята на къдравите скоби в C#, Java, PHP. Разбира се, само от към четимост. Но може да приемете, че би било същото, ако код от този тип работеше (би работил в пайтън в интерес на истината, стига да е по техния синтаксис):

while

   do smth

   smth else

   smth else more

if (x > y)

   i++

   j--

   for (T i : coll)

       smth more

 

Т.е. do smth, smth else и smth else more са част от WHILE блока. IF i++. j-- и for (с тялото му) са част от IF block-a. smth more е част от for block-a. Така и в по-горния пример, всичко интендирано на вътре от WHERE е част от WHERE клаузата.

Лошото е, че стингът ще придобие много долни черти в стринг като по-горния.

Няма ли някакъв друг начин, като heredoc syntax-а примерно?

Всъщност, отговорих си сам на въпроса

http://stackoverflow.com/questions/3671308/best-way-to-define-a-large-vba-string-i-e-heredoc-equivalent

 

1
GoShow avatar GoShow 595 Точки

След доста дълга борба, ето и моето решение на домашното. Реших да се поизмъча първо със задачата от C#. Успях да import-на библиотеката Wintellect.PowerCollections, с което всичко поне спря да свети в червено и се компилира. За съжаление ми дава около 8-9 runtime грешки, след което реших да не продължавам да дълбая и се спрях. Другото, което обаче се опитах за съжаление неуспешно да направя, беше да извадя всички класове в отделни файлове, както е редно, е... там нещата засветиха здраво. Затова се отказах, но ми е любопитно, дали някой от вас се е мъчил над същото. Другите задачи бяха горе-долу лесни, java-та, беше малко по-неприятна. Чакам коментари и критики, за които благодаря предварително!

0
GoShow avatar GoShow 595 Точки

Мерси, при първа възможност ще се коригирам!

0
Lili26 avatar Lili26 48 Точки

Ето и моето домашно ТУК.

Опитах се да разделя класовете в С# кода, но прецених, че по-добре да оставя вложените както са си. В Java кода махнах импортите, които не са нужни за този проект и много се чудих дали да не махна и неизползваните променливи, но реших да ги оставя. 

Иначе като цяло ми беше интересно това домашно. Не съм използвала тулчета за форматиране, всичко е ръчна изработка. :)

Ще се радвам на коментари.

0
RoYaL avatar RoYaL Trainer 6846 Точки

Главната ми забележка в РНР

   $obj -> method()

Не се прави така. Не трябва да има whitespace-ове между T_OBJECT_OPERATOR-а и operand-ите. Трябва да е $obj->method();

Странно, че си го направила така, при положение, че примерно в C# не си отделила оператора по този начин.

Другото е - стрингове/стрингове репрезентации е хубаво да бъдат отделени с ЕДИН спейс от concatenate operator-а: 'importSetting'.$short_name; трябва да е 'importSetting' $short_name;

assingment operator-а трябва да отделен с по ЕДИН спейс от името на променливата и стойността й.: protected $settings=[]; трябва да стане protected $settings [];

Другото интересно нещо, което не се включва обаче в темата за форматиране на код, но пък се учи и в двете дисциплини - ООП и КПК е именоването на класове.

Какво е class Manager?

Класовете трябва да Entity-та. От там аз изхождам, че този мениджър ще си има нещо повече от настройки, някаква описателност, защо е мениджър - но такова няма. Мениджър, на който можеш да му вземеш сетингите и да му импортнеш такива? Името далеч не подхожда на тялото на класа.

Тук ще линкна една тема относно това, че колкото и описателен да е този мениджър, е хубаво да НЯМАМЕ КЛАС НА ИМЕ Manager.

 

http://stackoverflow.com/questions/1866794/naming-classes-how-to-avoid-calling-everything-a-whatevermanager

 

И на последно място, понеже вярвам е от недоглеждане:

if (!array_key_exists($name, $this -> settings)) {
$this -> settings[$key] = new $setting();
}

Контента трябва да се индентира с ЧЕТИРИ спейса:

if (!array_key_exists($name, $this -> settings)) {
    $this -> settings[$key] = new $setting();
}

 

2
Lili26 avatar Lili26 48 Точки

 RoYaL, много ти благодаря за градивната критика. Много ми помогна. Специално за if конструкцията, която си ми обърнал внимание в края на коментара ти, при мен и в Notepad++ и в PHPStorm излиза коректно- с табулацията, но в GitHub излиза без или пък с два таба. Не знам защо. 

Благодаря ти за отделеното време.

0
RoYaL avatar RoYaL Trainer 6846 Точки

Настрой си IDE-то да прави индентациите не като табулации, а като четири спейса, тогава няма да има подобни несъотвествия :)

1
petrovaliev95 avatar petrovaliev95 358 Точки

Макар и със закъснение ЕТО го и моето домашно. Бих се радвал, ако някой отдели време да прегледа кода и даде коментар по него.

3
02/10/2014 00:15:43
RoYaL avatar RoYaL Trainer 6846 Точки

На

https://github.com/petrovaliev95/Software-University/blob/master/High%20Quality%20Code%20September%202014/Homeworks/02_Code-Formatting/Manager.php

Неймспейса трябва да е нов ред от отварящия РНР таг.

Между полето $settings и метода exists() трябва да има празен ред

Конкатенацията на importSetting не би трябвало да се нуждае от нов ред

1
petrovaliev95 avatar petrovaliev95 358 Точки

Благодаря ти за отделеното време колега. Това за неймспейса не го знаех наистина, другите са от недоглеждане. Ще се радвам на още коментари по кода ми.

П.С. Грешките са поправени.  


Поздрави, Даниел

3
02/10/2014 12:00:01
RoYaL avatar RoYaL Trainer 6846 Точки

На C# някои от еднорадовите ти конструкции нямат къдрави скоби, а други имат. Въпреки, че е препоръчително всички да имат, не мога да кажа че едното е грешно, а другото е правилно - просто си избери САМО едното. 

или 

if (true)

{

    // do smth;

}

 

или

if (true)

    // do smth

 

Най-непрепоръчително е да ги смесваш и навсякъде където го правиш ще имаш отрицателни отзиви от колегите си.

0
slavi.koen avatar slavi.koen 38 Точки

Здравейте , и от мен.

И аз съм на мнение, като се оправи кода от неточностите и се направи семантично правилен, е хубаво и да е логически такъв, като дадем "Run" да се завърти един реален и работещ код.

А отностно задачите,

C#-ския код , не разбрах тази библиотека "Wintellect.PowerCollections" , от къде точно идва, но това е по скоро към горния проблем.

В Java кода след като го редактирах семантично, Eclipse също пищеше,че съм му въвел странни библиотеки и обекти,  които не съществуват никъде.

Но най-големия проблем поне при мене беше с JavaScript-a , след като го редактирах VS ми изписваше за всички методи "eval()" надписа "eval is evil", нямам идея какво точно значи това, ако няма знае бих се радвал да ми отговори и също така да попитам дали "===" е по правилно от "==", тъй като това беше другия съвет от страна на VS.

И друго, което ми направи лошо впечатление беше коментара на най-долния ред от кода-"fostata". Знам,че е сложен с цел да изтриваме  подобни не на място коментари, но можеше да се сложи нещо по цензурирано според мен. :)

 

Ето го и моето домашно, ще се радвам да му хвърлите едно око, за евентуални пропуски.
Домашно

0
02/10/2014 15:00:29
RoYaL avatar RoYaL Trainer 6846 Точки

Извинявай, не искам да се заяждам (т.е. искам, щото съм гаден заядлив човек, но в момента не ми е това идеята), но погледнал ли си кода си как изглежда в гитхъб, защото най-малкото на което ми прилича е да е форматиран :)

Не използвай табулации за индентация, а ЧЕТИРИ спейса. Така е по неформално общо приетата конвенция. Иначе eval е evil защото ако позволиш на юзър инпут да се екзекютне във функцията ще резултира до код. Напиши в гугъл "Why eval is evil"

Прикачвам ти скрийншот от РНР-то

1
slavi.koen avatar slavi.koen 38 Точки

Здравей, мерси за критиката, не си бях погледан Хъба, от там идваше проблема погледнах и видях, че и другите кодове са омазани.

Редактирах ги и вече мисля, че са по-читави.

П.П. Ползвах табулация, зариди съвета на Владо да използваме таб а не спейс, тъй като спейса, гълта повече памет, но явно извън редакторите става грозна работа.

0
RoYaL avatar RoYaL Trainer 6846 Точки

Продължавам да виждам проблеми с този тип форматиране.

примерно в getPath()

$settings пропъртито по някаква причина също се е дублирало.

Имаш методи на които отварящата скоба е на същия ред, а на други е на нов ред (това не вярвам в редактора да е ОК?)

0
petrovaliev95 avatar petrovaliev95 358 Точки

Направих всички със скоби. Мисля, че така е по-добре.

3
Filkolev avatar Filkolev 4485 Точки

Здравейте,

Интересува ме задачата по C# - не трябва ли да разделим класовете в различни файлове? Казва се да реформатираме даденият .cs, но аз поне не го приемам това като задължение да оставим всичко в един файл.

2
AleksandurSeferinkin avatar AleksandurSeferinkin 335 Точки

То това е уловката... Насукани са класове в класове и всичко в 1 файл. Това беше първото нещо, което оправих. :)

ПС: Като гледам решенията, никой не е обърнал внимание на онуй правило за преизползване на кода. В js програмата има 4 функции, които могат да се сведат до 2 такива.

1
30/01/2015 14:00:30
Filkolev avatar Filkolev 4485 Точки

Питам, защото решенията, които видях отгоре-отгоре до момента, всички бяха просто с пооправени индентации в същия засран файл, което по никакъв начин не го прави качествен код.... 

1
AleksandurSeferinkin avatar AleksandurSeferinkin 335 Точки

Има още неща, които не са оправили... именуване на променливи... и т.н. :)

1