Skip to content

Commit

Permalink
New Homework Added
Browse files Browse the repository at this point in the history
New Homework Added
  • Loading branch information
nikolavn committed Sep 11, 2015
1 parent 2d29f7e commit 0881703
Show file tree
Hide file tree
Showing 7 changed files with 192 additions and 122 deletions.
9 changes: 9 additions & 0 deletions High-Quality-Code/17. Design Patterns/Behavioral/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Behavioral Patterns Homework

* Select 4 behavioral design patterns
* Write a short description (about half page) for each of them
* Describe their motivation, intent, applicability, known uses, implementation, participants, consequences, structure, related patterns, etc.
* Use [Markdown](https://help.github.com/articles/github-flavored-markdown/) for the description (`.md` files) and upload it on your own GitHub
* Prefer Bulgarian language
* Provide your own C# examples for their use
* Provide a UML diagram or image of the pattern
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#[Abstract Factory](https://sourcemaking.com/design_patterns/abstract_factory)

Този шаблон е подобен на **Simple Factory** и **Factory** шаблоните с тази разлика, че **Abstract Factory** предоставя интерфейс за създаване на няколко свързани обекта (>фамилия от обекти) вместо само един. Самите обекти могат или да са абстрактни или да не са, като потребителят използващ интерфейса не знае конкретния им клас.

**Abstract Factory** се използва:

* В системи, които се променят често

Шаблонът предоставя гъвкав механизъм, чрез който да се подменят различни множества от обекти.
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#[Builder](https://sourcemaking.com/design_patterns/builder)

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

1.**Builder** шаблонът решава 3 основни проблема:

* Скрива от потребителя всички параметри нужни за създаването на конкретен обект
* Енкапсулира стъпките и техният ред, така че да не трябва да се помни
* Скрива от потребителя всички възможни представяния на даден обект

2.Шаблонът има следните елементи:

* **Director** – дефинира точната последователност от стъпки. Използва **Builder**.
* **Builder** – дефинира всички стъпки. Използва се от **Concrete Builder**.
* **Concrete Builder** – определя изпълнението. Имплементира **Director**.
* **Product** – създава се от **Concrete Builder**. Продуктите са от еднакъв тип, но съдържат различни данни.
9 changes: 9 additions & 0 deletions High-Quality-Code/17. Design Patterns/Creational/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Creational Patterns Homework

* Select 3 creational design patterns
* Write a short description (about half page) for each of them
* Describe their motivation, intent, applicability, known uses, implementation, participants, consequences, structure, related patterns, etc.
* Use [Markdown](https://help.github.com/articles/github-flavored-markdown/) for the description (`.md` files) and upload it on your own GitHub
* Prefer Bulgarian language
* Provide your own C# examples for their use
* Provide a UML diagram or image of the pattern
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#[Singleton](https://sourcemaking.com/design_patterns/singleton)

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

**Singleton** шаблонът трябва да съдържа следните елементи:

1. Поле, което да пази инстанцията на класа. То трябва да е с модификатори за достъп *private* и *static*.

2. Празен конструктор без параметри с ниво на достъп *protected*/*private*. Това се прави цел класа да не може да се инстанцира извън себе си и наследниците си и да не се създаде празен публичен конструктор. Така се гарантира, че класът ще има едиснтвена инстанция.

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


Шаблонът има някои недостатъци като:

- Нарушава *Single Responsibility* принципа. В рамките на един клас се съчетават две отговорности (гарантира се единствена инстанция и се осигурява достъпът до нея)

- Внася тясна свързаност м/у себе си и всеки клас, който го използва. Класовете използващи **Singleton** класът не могат да съществуват самостоятелно и независимо от него.

- Не е сигурен в многонишкова среда. Причината е за това е, че две (или повече нишки) могат да достъпят едновременно проверката, дали съществува инстанция на класа и едновремнно да я изчислят като невярна. В този случай ще се създадат две инстанции на **Singleton** класа, което нарушава шаблона.
9 changes: 9 additions & 0 deletions High-Quality-Code/17. Design Patterns/Structural/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Structural Patterns Homework

* Select 3 structural design patterns
* Write a short description (about half page) for each of them
* Describe their motivation, intent, applicability, known uses, implementation, participants, consequences, structure, related patterns, etc.
* Use [Markdown](https://help.github.com/articles/github-flavored-markdown/) for the description (`.md` files) and upload it on your own GitHub
* Prefer Bulgarian language
* Provide your own C# examples for their use
* Provide a UML diagram or image of the pattern
242 changes: 120 additions & 122 deletions JS OOP/06. Modules and Patterns/task-1.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* Task Description */
/*
/*
* Create a module for a Telerik Academy course
* The course has a title and presentations
* Each presentation also has a title
Expand All @@ -8,7 +8,7 @@
* Each student has firstname, lastname and an ID
* IDs must be unique integer numbers which are at least 1
* Each student can submit a homework for each presentation in the course
* Create method init
* Accepts a string - course title
* Accepts an array of strings - presentation titles
Expand All @@ -17,31 +17,31 @@
* Titles do not have consecutive spaces
* Titles have at least one character
* Throws if there are no presentations
* Create method addStudent which lists a student for the course
* Accepts a string in the format 'Firstname Lastname'
* Throws if any of the names are not valid
* Names start with an upper case letter
* All other symbols in the name (if any) are lowercase letters
* Generates a unique student ID and returns it
* Create method getAllStudents that returns an array of students in the format:
* {firstname: 'string', lastname: 'string', id: StudentID}
* Create method submitHomework
* Accepts studentID and homeworkID
* Create method submitHomework
* Accepts studentID and homeworkID
* homeworkID 1 is for the first presentation
* homeworkID 2 is for the second one
* ...
* Throws if any of the IDs are invalid
* Create method pushExamResults
* Accepts an array of items in the format {StudentID: ..., Score: ...}
* StudentIDs which are not listed get 0 points
* Throw if there is an invalid StudentID
* Throw if same StudentID is given more than once ( he tried to cheat (: )
* Throw if Score is not a number
* Create method getTopStudents which returns an array of the top 10 performing students
* Array must be sorted from best to worst
* If there are less than 10, return them all
Expand All @@ -51,119 +51,117 @@
*/

function solve() {
var Course = {
init: function(title, presentations) {
this.courseTitle = title;
this.presentationsList = presentations;
this.students = [];
studentID = 0;

return this;
},
addStudent: function(name) {

var nameAsArray = [];
studentID += 1;

nameAsArray = name.split(' ');

if (nameAsArray.length > 2 || nameAsArray.length < 2) {
throw new Error('Student can not have more or less than 2 names');
}

if (!nameAsArray.every(isValidName)) {
throw new Error('Name is invalid. Should contain only letters starting with capital one.');
}

var currentStudent = {
firstname: nameAsArray[0],
lastname: nameAsArray[1],
id: studentID
};

this.students.push(currentStudent);

return studentID;
},
getAllStudents: function() {
return this.students.slice();
},
submitHomework: function(studentID, homeworkID) {
if (!isValidID(studentID, 1, this.students.length)) {
throw new Error('Student with this ID: ' + studentID + 'doesn\'t exist');
}
if (!isValidID(homeworkID, 1, this.presentationsList.length)) {
throw new Error('Homework with this ID: ' + homeworkID + 'does\'t exist');
}
},
pushExamResults: function(results) {},
getTopStudents: function() {}
};

Object.defineProperty(Course, 'courseTitle', {
get: function() {
return this._title;
},
set: function(value) {
if (!isValidTitle(value)) {
throw new Error('Course title is not valid');
}

this._title = value;
}
});

Object.defineProperty(Course, 'presentationsList', {
get: function() {
return this._presentationsList;
},
set: function(value) {
if (!value.every(isValidTitle)) {
throw new Error('One or more presentations have invalid title.');
}

if (!arrayExists(value)) {
throw new Error('Presentations list is empty');
}

this._presentationsList = value;
}
});

Object.defineProperty(Course, 'students', {
get: function() {
return this._students;
},
set: function(value) {
this._students = value;
}
});

function arrayExists(array) {
return typeof array !== "undefined" && array !== null && array.length > 0;
}

function isValidID(id, min, max) {
if ((isNaN(id) || isNaN(Number(id))) || (min > id || id > max)) {
return false;
}

return true;
}

function isValidName(name) {
return /^[A-Z][a-z]*$/g.test(name);
}

function isValidTitle(title) {
if (title.length === 0 || (title !== title.trim()) || title.match(/\s{2,}/)) {
return false;
}

return true;
}

return Course;
var Course = {
init: function (title, presentations) {
this.courseTitle = title;
this.presentationsList = presentations;
this.students = [];
studentID = 0;
return this;
},
addStudent: function (name) {

var nameAsArray = [];
studentID += 1;
nameAsArray = name.split(' ');

if (nameAsArray.length > 2 || nameAsArray.length < 2) {
throw new Error('Student can not have more or less than 2 names');
}

if (!nameAsArray.every(isValidName)) {
throw new Error('Name is invalid. Should contain only letters starting with capital one.');
}

var currentStudent = {
firstname: nameAsArray[0],
lastname: nameAsArray[1],
id: studentID
};

this.students.push(currentStudent);

return studentID;
},
getAllStudents: function () {
return this.students.slice();
},
submitHomework: function (studentID, homeworkID) {
if (!isValidID(studentID, 1, this.students.length)) {
throw new Error('Student with this ID: ' + studentID + 'doesn\'t exist');
}
if (!isValidID(homeworkID, 1, this.presentationsList.length)) {
throw new Error('Homework with this ID: ' + homeworkID + 'does\'t exist');
}
},
pushExamResults: function (results) {},
getTopStudents: function () {}
};

Object.defineProperty(Course, 'courseTitle', {
get: function () {
return this._title;
},
set: function (value) {
if (!isValidTitle(value)) {
throw new Error('Course title is not valid');
}

this._title = value;
}
});

Object.defineProperty(Course, 'presentationsList', {
get: function () {
return this._presentationsList;
},
set: function (value) {
if (!value.every(isValidTitle)) {
throw new Error('One or more presentations have invalid title.');
}

if (!arrayExists(value)) {
throw new Error('Presentations list is empty');
}

this._presentationsList = value;
}
});

Object.defineProperty(Course, 'students', {
get: function () {
return this._students;
},
set: function (value) {
this._students = value;
}
});

function arrayExists(array) {
return typeof array !== undefined && array !== null && array.length > 0;
}

function isValidID(id, min, max) {
if ((isNaN(id) || isNaN(Number(id))) || (min > id || id > max)) {
return false;
}

return true;
}

function isValidName(name) {
return /^[A-Z][a-z]*$/g.test(name);
}

function isValidTitle(title) {
if (title.length === 0 || (title !== title.trim()) || title.match(/\s{2,}/)) {
return false;
}

return true;
}

return Course;
}

module.exports = solve;

0 comments on commit 0881703

Please sign in to comment.