Loading...

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

Valleri avatar Valleri 304 Точки

[Homework] OOP - OOP In Java - Септември 2014

Здравейте,
след това домашно, които се е чудил защо Java-та се хейти ще му стане ясно, и даже може и да си купи Visual Studio от вендора (Visual Studio 2012 Premium with MSDN: $2,569).

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

1.  Geometry - на пръв поглед лесна задача, но не бях пипвал джава от 3 месеца и ми отне доооста време.
2. 1LevShop

А
ко имате забележки, споделете, много писане е и може и да съм забравил нещо.

Приятно кодене!

Тагове:
9
C# OOP Basics
RoYaL avatar RoYaL Trainer 6849 Точки

Лол, Джавата се хейти, защото хората не я разбират? Това ли трябваше да разберем? :)

Ами всъщност, имам новина за вас - или започваш да разбираш езика, на който ти се налага да пишеш, или намираш начин да пишеш на друг език - това са изходите :)

За ламбдите има доста информация в интернет, и то от преди да ги пуснат даже се започна да се залива пространството с тях. 

Грам повече не се пише. Всъщност, кодът може да изглежда повече, но писането - не. В съвременното програмиране, много по-малко е реалното писане на код когато ползваме IDE-та. Еклипс си е създаден за Джава и дори без кой знае какви допълнения, ти помага с един клик на code suggestions и enter да генерираш повечето неща, които в C# сме свикнали да ги пишем на 1 ред.

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

За домашното:

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

3
Valleri avatar Valleri 304 Точки

Окей, ще се опитам да бъда по-толерантен : )

0
birkoff avatar birkoff 46 Точки

Всъщност, само в България се хейтва Джавата. Или поне аз така ви разбирам. Пътувал съм в много страни и никъде няма

такъв негативизъм за Джавата както в България, и то повече от хора които не са много на дълбоко в програмирането.

Само едно ще ви кажа, сметнете си: Java 6 + Glassfish + Eclipse + Linux = $0; а сега направете същото и за: .Net + IIS + VS + R# + Windows Server

4
15/10/2014 13:51:27
borislavml avatar borislavml 368 Точки

Valleri как успя да си зъздадеш  две отделни папки за двата проекта в /src папката. Всеки път когата си зъздавам нов folder вътре в /src Еclipse ми го праваи на package. В stackoverflow има такава тема ЦЪК, но там не дават решение на проблема а варинти да имаш папки в директорията където е /src или през настройки да напрввиш /src обикновенна папка и в нея да ръгаш друго /src папки. Как по дяволите я направи ти тая магия :)

Аз съм с Eclipse Kepler 4.3.3 Ти на какво си?

1
Valleri avatar Valleri 304 Точки

http://postimg.org/image/jps9wg8dv/

И при мен са като "package", явно в Java файловата структура и package структурата трябва да са огледални, както е с името на файла и името на класа. : (
Иначе създадох папката с дясно копче на package, "geometry" например, и след това "New Folder".

На "Luna" съм.

0
15/10/2014 22:30:31
borislavml avatar borislavml 368 Точки

Да, усетих се за кво иде реч. В Еclipse ги показва като пакети, но реално са си папки. Доста е объркващо като идваш от namespace-и.

0
ttitto avatar ttitto 1153 Точки

Всъщност това, което се води за добра практика при C# е направено задължително в Java.

Имам предвид, че всеки namespace трябва да е в отделна папка. В джава изискването всеки package да е в отделна папка е допълнено с изискването папката и package-а да имат едно и също име.

Няма нищо объркващо в това. Дори е съвсем логично.

0
externo avatar externo 119 Точки
  1. Geometry
  2. 1lv Shop - Ползвах тестовата система на Валери
2
16/10/2014 15:18:13
Valleri avatar Valleri 304 Точки

Решението ти да има само един клас за Vertix е малко неефективно. Какво става ако искаме в бъдеще да добавим поддръжка на 6 измерения? Ще трябва да правим тази проверка за 'z' и за други 3 променливи. По-добър вариант е да имаш Отделни класове, за да не можеш да слагаш 3D Verix в PlainShape.
Също така не е нужно всеки child-class на Plain или Space Shape да имат Vertix[], благодарение на наследяването може да си спестиш код. 
Може да си спестиш проверката в всеки клас за setVertices. След като си решил така да направиш вместо, например, да сетнеш размера на array в конструктура - добре, но за да спестиш проверяването в всеки child-class и представи си след време трябва да добавиш още 100, направи проверката в Shape и повече не се занимавай с нея : )

2
externo avatar externo 119 Точки

Мерси, когато има време ше ги дооправям :)

0
arsoman avatar arsoman 419 Точки

Може ли малко помощ:

List<Shape> largeVolumeShapes = Arrays.asList(shapeCollection)

.stream()

.filter(s -> s instanceof VolumeMeasurable)

.filter(v -> ((VolumeMeasurable) v)

.getVolume() > 40)

.collect(Collectors.toList());

дава ми грешка при компилация, казва, че няма променлива s, на този ред:

.filter(s -> s instanceof VolumeMeasurable)

как го правите това да работи, провах да импортна посочените от колеги пакети, но не става?! Благодаря!

PS: Копнах кода от презентацията, той гърми на същото място:

List<Integer> values =

Arrays.asList(

   1, 2, 3, 4, 5, 6, 7, 8);

System.out.println(

values.stream()

   .filter(e -> e > 3)

   .filter(e -> e % 2 > 0)

   .map(e -> e * 2)

   .findFirst()

);

0
17/10/2014 00:27:46
Petyr avatar Petyr 9 Точки

Ами копирах този код (List<Integer>) в твоя коментар и не ми гръмна никъде...

Направих и Shape[] shapeCollection = new Shape[6]; като добавих елементи, копирах кода от твоя проект и пак тръгна без да гърми ...

Аз съм го направил -> така.

Виж ако искаш и кода на колегата Valleri->github.

1
Valleri avatar Valleri 304 Точки

Да не си на Java 7 :?
Може да пробваш да сложиш тип на параметрите, но то е същото според документацията.

1
17/10/2014 08:39:50
arsoman avatar arsoman 419 Точки

Благодаря, ще проверя за версията на Java, доста странно ми дава, може и да си прав. Сега съм на работа, довечера ще отговоря.

0
ZvetanIG avatar ZvetanIG 907 Точки

Благодарности към колегите споделили домашното си. Наистина ми бяха от полза в часта със stream.  Ето и моето домашно, което се постарах да не е като на колегите.

1.  Geometry

2. 1Lev Shop

Колегите, които не им тръгват ламда изразите да обърнат внимание дали са избрали последната версия на Java (1.8), че аз брах доста ядове с 1.7.

5
19/10/2014 22:30:11
milen8204 avatar milen8204 296 Точки

С ламдите аз се оправих с Eclipse Luna и JDK 8, естествено със значителна помощ stackoverflow

1
milen8204 avatar milen8204 296 Точки

Здравейте колеги,

ето и моите решения на задачите, лично на мен ми бяха доста интересни:

  1. Geometry; Тук съм направил два отделни класа за 2D и 3D координатитете.... мислех да го направя с един клас, в който да има два конструктора като за 2D обектите да cooordZ да е "0", но сметнах, че няма да е издържано защото ще се бъркат потребителите на този клас :).
  2. OneLevShop Тук проявих някаква странна форма на мазохизъм и за цената на продуктите не използвах double (както е зададено по условие, за да ни е по-лесно), а използвах BigDecimal.

Приемам всякакви съвети, забележки и псувни (стига да не закачате майка ми) tongue-out.

1
18/10/2014 22:01:09
Lili26 avatar Lili26 48 Точки

Здравейте колеги, ето и мойте решения.

4
venconi91 avatar venconi91 18 Точки

Здравейте,
едно въпросче относно втора задача 1lvShop. Проблема ми е следния 


Как е възможно в клас койно не е дъщерен на никой друг да има достъп до protected полетата на други класове?

public class Main {
public static void main(String[] args) {

Product p1 = new Computer("ime", 120.3, 2, AgeRestriction.ADULT, 24);
p1.price = 399;
System.out.println(p1.price);
}
}

// при печатането цената е 399

като се има предвид че по йерархията всички полета са ми protected КАК може в MAIN класа да има достъп до всички тия полета след като MAIN-a не е наследник? На практика излиза че protected = public. 

Идеи?

0
Valleri avatar Valleri 304 Точки

Variables, methods and constructors which are declared protected in a superclass can be accessed only by the subclasses in other package or any class within the package of the protected members' class.

Хах...малко странно е това, но не ми се струва добра идея да ги сменя на private - наследяването на полета няма да работи..

1
venconi91 avatar venconi91 18 Точки

Много смотана работа. Така излиза че в крайна сметка трябва да прецакаме енкапсулацията или да прецакаме наследяването или поне така го разбирам аз...

0
RoYaL avatar RoYaL Trainer 6849 Точки

Не, не трябва да прецакваш нищо. low-level access-ите (тези под public) са направени за хората, които няма да пишат в библиотеката ти, а само ще я ползват.

Когато ползваш неща от библиотеката си, вътре в нея - ти не я ползваш като API, съответно е логично да може да ползваш protected member-ите. Когато я ползваш извън себе си, т.е. правиш нов апликейшън и ползваш библиотеката си, за да си свършиш работата - тогава нивото на видимост опира само до public member-ите, така както трябва да бъде - да виждаш това, с което можеш да си помогнеш само.

Има и друго - за какво ти е полетата да са protected? В джава конвенцията е да не ползваш полетата директно НИКОГА. Само през техните пропъртита т.е. setter-ите и getter-ите.

Съвсем спокойно в абстрактния клас декларираш всички полета private правиш им аксесори които са public/protected и си готов.

Нека ти покажа един тест:

Клас родител:

public class TestProtected {

    private int x;

    public int getX() {
        return this.x;
    }

    public void setX(int x) { // този може да го направиш protected
        this.x = x;
    }
}

 

Клас наследник:

public class TestProtectedChild extends TestProtected {

     public TestProtectedChild(int x) {
          this.setX(x);
     }
}

 

Клас от който пускаме апликейшъна:

public class Test {

     public static void main(String[] args) {
         TestProtectedChild ch = new TestProtectedChild(100);

         System.out.println(ch.getX());
     }
}

 

Познай какво се принти на конзолата - 100 :)

В TestProtectedChild не можеш да ползваш this.x (както и в Test не можеш ch.x) но можеш да ползваш неговите аксесори, съответно : getX() и setX().

Важно е да се разбере, че намалянето на нивото на видимост, не е с цел да защитиш нещо никой never ever да го види, а да направиш живота по-лесен на тези, които ти ползват библиотеката. Интересно виждане по случая, и какво би ти струвало нещо да е public казва Eric Lippert в един от отговорите си в StackOverflow (по-рано през месеца пуснах цяла тема за това тук)http://stackoverflow.com/questions/7391550/why-is-the-amount-of-visibility-on-methods-and-attributes-important/7392118#7392118

 

1
20/10/2014 10:01:14
vonko1988 avatar vonko1988 6 Точки

Здравейте.

 Досега не бях пипал Java, но за да си обогатя общата култура се престраших. Лекцията на Наков беше много полезна, колкото е възможно за 3 часа човек да придобие идея за езика.

Написах задачките от домашните и ми направи впечатление следното:

 -Eclipse е много дървен в сравнение с Visual Studio. Чак накрая като свърших, си изтеглих IntelliJ и воала, ТОВА Е МНОГО ПО–ДОБРО! Само че там не успях да подкарам ламбдите :D (предполагам ако поровя има начин)

 -Java-та не е лош език, но е една идея по-тромав. Това с generic-s е доста дразнещо. Аз лично обаче най-много негатив събрах не от езика, а от ИДЕ-то. 

 Вече незнам как стои въпроса с уеб технологиите на Java, но едва ли имат нещо което да се сравнява по мощ и УДОБСТВО с ASP.NET MVC.

 Успех на всички ви и весели празници :)

0
RoYaL avatar RoYaL Trainer 6849 Точки

Имат, казва се Spring MVC

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.