Skip to content

Commit 1961eac

Browse files
authored
Merge pull request #1 from NONstop5/task-1_rewrite_code_on_php
task-1_rewrite_code_on_php
2 parents 4c1c53c + ddf3356 commit 1961eac

27 files changed

+885
-0
lines changed

.editorconfig

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
root = true
2+
3+
[*]
4+
charset = utf-8
5+
end_of_line = lf
6+
insert_final_newline = true
7+
indent_style = space
8+
indent_size = 4
9+
trim_trailing_whitespace = true
10+
11+
[*.md]
12+
trim_trailing_whitespace = false
13+
14+
[Makefile]
15+
indent_style = tab

.github/workflows/main.yml

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# Name of workflow
2+
name: PHP CI
3+
4+
# Trigger the workflow on push or pull request
5+
on:
6+
- push
7+
- pull_request
8+
9+
jobs:
10+
# build – произвольно выбранное имя задания
11+
# их может быть больше одного
12+
build:
13+
# The type of machine to run the job on
14+
runs-on: ubuntu-latest
15+
16+
steps: # список шагов, которые надо выполнить
17+
# экшен — выполняет какую-то задачу
18+
# checkout — клонирует репозиторий
19+
# Check-out repository under GitHub workspace
20+
# https://github.com/actions/checkout
21+
- uses: actions/checkout@v4
22+
# Step's name
23+
- name: Setup PHP
24+
# Action gives to setup the PHP environment to test application
25+
# https://github.com/shivammathur/setup-php
26+
uses: shivammathur/setup-php@v2
27+
with:
28+
# Specify the PHP version
29+
php-version: '8.3'
30+
# Install project
31+
- name: Install project
32+
run: make install
33+
# Run linter
34+
- name: Run linter
35+
run: make lint

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
/vendor/
2+
.idea
3+
.DS_Store
4+
.vscode

Description.md

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
## Задача, которую решает код
2+
3+
Есть список животных:
4+
- Bird
5+
- Dog
6+
- Cat
7+
- Elephant
8+
- Rhino
9+
- Lion
10+
- Squirrel
11+
12+
Каждое животное занимает какой-то объем:
13+
- Bird = 0.25
14+
- Dog = 0.4
15+
- Cat = ?
16+
- Elephant = 0.6
17+
- Rhino = 0.6
18+
- Lion = ?
19+
- Squirrel = ?
20+
21+
А так же список помещений:
22+
- Hall
23+
- Bedroom
24+
- Bathroom
25+
- Balcony
26+
27+
У каждого помещения есть вместимость (объем), которое задается при создании каждого типа помещения, т.е. может меняться.
28+
29+
> Необходимо разместить список животных в списке помещений по определенной логике.
30+
> Определенные типы животных должны быть размещены только в определенных типах помещений, а не в любых.
31+
32+
Функция принимает на вход массив животных и массив помещений, в которых этих животных надо разместить:
33+
```
34+
arrangeAnimalsAmongRooms(Animal[] animals, Room[] rooms)
35+
```
36+
37+
Какие животные в каких помещениях должны быть размещены:
38+
- Bird => Hall
39+
- Dog => Bedroom
40+
- Cat => ?
41+
- Elephant => Balcony
42+
- Rhino => Bedroom
43+
- Lion => ?
44+
- Squirrel => ?
45+
46+
## Замечания после изучения кода
47+
- Не все типы животных обрабатываются. Нет условий для Cat, Lion, Squirrel. Т.е. они никогда не будут размещены
48+
- Как следствие из предыдущего пункта, невозможно понять какой объем занимают Cat, Lion, Squirrel и в какие помещения они должны быть размещены
49+
- После размещения некоторых типов животных, например Dog и Rhino, выбрасывается исключение, что останавливает выполнение программы и размещение остальных животных из массива не будет произведено
50+
- При размещении животных, `capacity` у помещений проверяется некорректно, т.к. оно сравнивается лишь с 0, хотя после размещения capacity может уйти в минус
51+
- При размещении Elephant в консоль выводится сообщение `A new elephant just arrived`, хотя при размещении других животных никаких сообщений не выводится, что странно
52+
- При размещении животных Dog, Rhino присутствует `break`, т.о. эти животные будут размещены только в одном помещении нужного типа. А логика размещения животных Bird, Elephant не содержит `break`, т.о. получится, что одно и то же животное будет одновременно размещено в разных помещениях одного типа, что физически невозможно
53+
- При размещении Dog, вне зависимости от того нашлось помещение для собаки или нет, то выбрасывается исключение с текстом `Dog(s) can be arranged`, говорящее о том, что с собакой можно разместиться, хотя это может быть не так. Это из-за того, что забыли сделать `foundRoom = true;`. И сам текст исключения не корректный
54+
- При размещении Rhino текст исключения `Rhinos(s) can be arranged` не корректный. Должно быть написано, что носороги НЕ могут быть размещены
55+
- Перебор массивов объектов лучше делать через foreach, тогда можно будет не вычислять длину этих массивов, а просто перебирать все элементы
56+
- Так же не понятно какой итоговый результат мы получаем после вызова функции и как это проверить. Нам же надо наверняка разместить именно всех животных. Если так, то тогда выбрасывание исключений оправдано.
57+
58+
## Каким должен быть код
59+
- Универсальным и легко расширяемым, соответствующий принципам SOLID, без дублирований
60+
- Мы должны иметь возможность легко и быстро добавлять как новые типы животных так и новые виды помещений, без изменения ранее написанного кода
61+
- Логика, свойства и параметры каждого вида животного и помещений должны быть инкапсули́рованы только в этих объектах
62+
- Т.к. каждый вид животного, в свою очередь, может быть разного размера, то логично, что он может занимать и разный объем в помещении, поэтому сделаем возможность указывать объем каждого животного при его создании
63+
- Так же нам нужна связь жесткая животного с помещением, в котором его можно размещать. Поэтому этот признак так же будет указан у каждого вида животного.
64+
- Еще хорошо бы написать Unit-тесты

Makefile

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
install:
2+
composer install
3+
4+
run:
5+
php public/index.php
6+
7+
validate:
8+
composer validate
9+
10+
lint:
11+
composer exec -v phpcs src
12+
vendor/bin/phpstan analyse
13+
14+
lint-fix:
15+
composer exec -v phpcbf src
16+
17+
.PHONY: tests

README.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,22 @@
1+
### Project tests and linter statuses:
2+
[![Main](https://github.com/NONstop5/omcode_test/actions/workflows/main.yml/badge.svg)](https://github.com/NONstop5/omcode_test/actions)
3+
14
# Тестовое в компанию Omcode
25

36
## Задание
47
- Изучить предоставленный код на Java, понять по коду какую задачу решал разработчик.
58
- Переписать сначала код на PHP в исходном виде
69
- Предложить более удачную реализацию, при необходимости
10+
11+
### Requirements
12+
- PHP >= 8.3
13+
- Composer >= 2
14+
- make >= 4
15+
16+
### Installation
17+
> `git clone [email protected]:NONstop5/omcode_test.git`
18+
>
19+
> `make install`
20+
21+
### Launch
22+
> `make run`

composer.json

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{
2+
"name": "igor/omcode_test",
3+
"description": "omcode_test project",
4+
"type": "project",
5+
"license": "MIT",
6+
"autoload": {
7+
"psr-4": {
8+
"App\\": "src/"
9+
}
10+
},
11+
"authors": [
12+
{
13+
"name": "IgorIlyaguev",
14+
"email": "[email protected]"
15+
}
16+
],
17+
"require": {
18+
"php": ">=8.3"
19+
},
20+
"require-dev": {
21+
"squizlabs/php_codesniffer": "^3.12",
22+
"symfony/var-dumper": "^7.2",
23+
"phpstan/phpstan": "^2.1"
24+
}
25+
}

0 commit comments

Comments
 (0)