[OOP] - Defining Classes Part Two - Task 1,2,3,4


21

Ето условията на задачите: Цък

Ето моя прогрес по нея:

GitHub

Обяснение по класове ( и структури ):

1. Point3D - основната цел тук е да се създаде
точка в 3D пространството. Няма нищо особено - има полета за отделните точки и презаписваме ToString за да печата точката.

2. Path - пази лист от точки, като със свойството Paths достъпваме нашия лист, а с метода AddPoint добавяме нова точка в "пътя"

3. Distance3D - статичен клас, който отговаря за пресмятането на разстоянието м/у 2 точки ( зададени чрез Point3D ). Формулата може да намерите тук: Wiki

4. PathStorage -  тук имаме 2 основни метода:

- PathSave - обикаляме по точките в определен Path и ги записваме в файл

- PathLoad - приемаме лист от пътища за обработка от файл, като четем входа ред по ред. Входните данни приемаме в формата X,Y,Z , а '-' разделяме отделните точки.

Въпрос:

Та имам едно въпросче, което не е точно по задачата, а е по-общо - трябва ли структурите да се обособяват в отделни файлове като класовете или не ?


в C# OOP от Teodor92 (13062 точки)


Отговори



3
Като следваме логиката че структурите са стойностни класове, както знаем, а класовете са в отделни файлове - би трябвало структурите също да са в отделни файлове. Поне аз разсъждавам така...

от stoyanov (2483 точки)


2
Аз вчера като разгледах justBelot там struct си бяха отделно..

от iwitass (3695 точки)


1
По принцип ако клас/интерфейс/структура/енум е публичен, е добра идея да е в отделен файл, но това не е задължително. В Java примерно, ако имаш публичен клас във файл с друго име, получаваш грешка.



6
Здравейте,
от гледна точка на качествен код
всяко различно нещо се намира в различен файл.
Класове, структури, енумератори и т.н.
Поздрави,
Борис Гуцев

от Boris (3959 точки)


6

Нека и аз да представя някакво решение на първите 4 задачи - https://github.com/Bvaptsarov/Homework/tree/master/10.OOPSecondPart/PointStruct

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


от Prophian (1234 точки)


0
Само една малка корекция - в Point3D.cs си направил метод, който връща точката startCoord, а по условие се иска property.

от shristoff (747 точки)

0
Мерси за корекцията, сега ще я оправя :)

от Prophian (1234 точки)



1

Разгледах набързо и ми направи впечатление класа за Point3D

    static private Point3D zero = new Point3D(0, 0, 0); - Защо ти е статична променлива (член по ООП терминологията)?
 
тук :this() не е необходимо.
    public Point3D(int pointX, int pointY, int pointZ)
        : this() 
    {
        this.pointX = pointX;
        this.pointY = pointY;
        this.pointZ = pointZ;
    }
 
Направи и един "празен" конструктор Point3D(), който да задава стандартни (default) стойности 0, така ще може да махнеш статичната променлива (член по ООП терминологията). И за да зададеш нулева точка ще трябва да напишеш Point3d point = new Point3D();, което  ми е по-логично от Point3D(0,0,0); или Point3D point = Point3D.zero

от ipenev (1013 точки)


0
Ами не е ли това целта на 2ра задача ? Add a private static read-only field to hold the start of the coordinate system – the point O{0, 0, 0}. Add a static property to return the point O.

от Teodor92 (13062 точки)

0
Всъщност да. Не съм дочел условията :) Но пак си в грешка, защото ти си я направил private, а не readonly. static public readonly Point3D zero = new Point3D(); // ако си написал Point3D() да нулира. Добре е да я сложиш public, защото ако е реален използваем клас, ще ти трябва да я използваш при сметки например.

от ipenev (1013 точки)



5

Имената на property-тата започват с главна буква. Когато говорим за точка, ясно е че става въпрос за координати на точка - не е нужно PointX, само X стига. За справка виж структурата Point от System.Drawing.

Объркващо е клас Path да има property Paths. Не е добра идея така да излагаш на показ вътрешния си списък List<Point3D>, защото може да се манипулира отвън - да се добавят и трият елементи (въпреки че има само get, това на пречи да правиш Add, Remove и всичко, което се сетиш за един списък). get само забранява да правиш неща от рода на Path.Paths = new List..., но това не ти гарантира неприкосновеност на елементите му.

Формулата ти за разстояние не е като тази в Уикипедия :-). Имената на методите започват с глагола - DoSomething (CalcDistance, LoadPath, SavePath).

Ето и моя вариант (да не кажеш, че само критикувам ;-))

https://github.com/vic-alexiev/TelerikAcademy/tree/master/OOP/Homework%20Assignments/2.%20Defining%20Classes%20Part%20II/01.%20Point3D

EDIT: Забелязвам, че при дефинирането на двата варианта на GetEnumerator() дублирам код. По-добре е вторият да стане:

IEnumerator IEnumerable.GetEnumerator()

{
        return (this as IEnumerable<Point3D>).GetEnumerator();
}

от vic.alexiev (2299 точки)


0
Хахах сега видях какво глупост съм написал за разстоянието :D. Мерси за критиките ще нанеса корекции :)

от Teodor92 (13062 точки)

0
Според мен в PathStorage трябва да имаш списък от пътища, а не само списък от точки за едни път. В условието пише Create a static class PathStorage with static methods to save and load paths from a text file.

от AsenVal (3487 точки)



1
Относно 4-та точка, не ми е ясно какви са тези пътища които трябва да се зареждат. Какъв трябва да е формата? Файла трябва да съдържа само координати на точки или и нещо друго?

от stann1 (1378 точки)


0
Пътищата трябва да се образуват от поредица от точки, който са ти подадени под даден формат ( ти си го избираш ).

от Teodor92 (13062 точки)

0
благодаря ти за инфото

от stann1 (1378 точки)



1

Здравейте. Аз имам въпросче. Още във първата задача имахме да напишем 


 public override string ToString()
    {
        string Point = string.Format(
            " x: {0} , y: {1} , z:{2}", X,Y,Z
            );
        return Point;
    }
 
Въпроса ми е как се изпринтва то на конзолата? Или не служи за това? 

от mGerova (47 точки)


0
Ами Console.WriteLine(MyObjectName); или Console.WriteLine(MyObjectName.ТоString()); ( двете са едно и също ) ?

от Teodor92 (13062 точки)

0
Да. Изведнъж ми дойде на акъла и го пробвах и стана преди да видя отговора ти. Но мерси за бързия отговор

от mGerova (47 точки)


2
Това е моето решение http://pastebin.com/V2QFq47j
1.Създавам структурата strPoint3D, която ще държи данните за една точка от 3D Space и има конструктор със стойностите на X, Y,Z. Тук съм добавил и readonly полето за началото на координатната система О(0,0,0), тук е override на ToString().
2. Създавам static class CalcPoints3D, който се явява вътрешен клас за основният клас Point3D. Static метода CalcDistance, калкулира разстоянието между две точки подадени като аргументи, които са от тип структурата strPoint3D. В Main метода са показани тест за калкулиране на разстояние между две точки.
3. Създавам List

от szaekov (155 точки)


0
Здравей, исках да ти споделя две дребни препоръки...първо избягвай конкатенацията на стрингове, т.к. забавяш програмата... и второ когато пресмяташ дистанцията, няма смисъл да проверяваш, кое е по-голямото, т.к. дори и да се получи отрицателна разлика , когато я повдигнеш на квадрат тя става положителна.. може да се напише и с един ред :) btw и аз съм от СТЗ :)

от zhelyazkovn (2949 точки)