Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 4
trim_trailing_whitespace = true

[*.md]
trim_trailing_whitespace = false

[Makefile]
indent_style = tab
35 changes: 35 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Name of workflow
name: PHP CI

# Trigger the workflow on push or pull request
on:
- push
- pull_request

jobs:
# build – произвольно выбранное имя задания
# их может быть больше одного
build:
# The type of machine to run the job on
runs-on: ubuntu-latest

steps: # список шагов, которые надо выполнить
# экшен — выполняет какую-то задачу
# checkout — клонирует репозиторий
# Check-out repository under GitHub workspace
# https://github.com/actions/checkout
- uses: actions/checkout@v4
# Step's name
- name: Setup PHP
# Action gives to setup the PHP environment to test application
# https://github.com/shivammathur/setup-php
uses: shivammathur/setup-php@v2
with:
# Specify the PHP version
php-version: '8.3'
# Install project
- name: Install project
run: make install
# Run linter
- name: Run linter
run: make lint
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/vendor/
.idea
.DS_Store
.vscode
64 changes: 64 additions & 0 deletions Description.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
## Задача, которую решает код

Есть список животных:
- Bird
- Dog
- Cat
- Elephant
- Rhino
- Lion
- Squirrel

Каждое животное занимает какой-то объем:
- Bird = 0.25
- Dog = 0.4
- Cat = ?
- Elephant = 0.6
- Rhino = 0.6
- Lion = ?
- Squirrel = ?

А так же список помещений:
- Hall
- Bedroom
- Bathroom
- Balcony

У каждого помещения есть вместимость (объем), которое задается при создании каждого типа помещения, т.е. может меняться.

> Необходимо разместить список животных в списке помещений по определенной логике.
> Определенные типы животных должны быть размещены только в определенных типах помещений, а не в любых.

Функция принимает на вход массив животных и массив помещений, в которых этих животных надо разместить:
```
arrangeAnimalsAmongRooms(Animal[] animals, Room[] rooms)
```

Какие животные в каких помещениях должны быть размещены:
- Bird => Hall
- Dog => Bedroom
- Cat => ?
- Elephant => Balcony
- Rhino => Bedroom
- Lion => ?
- Squirrel => ?

## Замечания после изучения кода
- Не все типы животных обрабатываются. Нет условий для Cat, Lion, Squirrel. Т.е. они никогда не будут размещены
- Как следствие из предыдущего пункта, невозможно понять какой объем занимают Cat, Lion, Squirrel и в какие помещения они должны быть размещены
- После размещения некоторых типов животных, например Dog и Rhino, выбрасывается исключение, что останавливает выполнение программы и размещение остальных животных из массива не будет произведено
- При размещении животных, `capacity` у помещений проверяется некорректно, т.к. оно сравнивается лишь с 0, хотя после размещения capacity может уйти в минус
- При размещении Elephant в консоль выводится сообщение `A new elephant just arrived`, хотя при размещении других животных никаких сообщений не выводится, что странно
- При размещении животных Dog, Rhino присутствует `break`, т.о. эти животные будут размещены только в одном помещении нужного типа. А логика размещения животных Bird, Elephant не содержит `break`, т.о. получится, что одно и то же животное будет одновременно размещено в разных помещениях одного типа, что физически невозможно
- При размещении Dog, вне зависимости от того нашлось помещение для собаки или нет, то выбрасывается исключение с текстом `Dog(s) can be arranged`, говорящее о том, что с собакой можно разместиться, хотя это может быть не так. Это из-за того, что забыли сделать `foundRoom = true;`. И сам текст исключения не корректный
- При размещении Rhino текст исключения `Rhinos(s) can be arranged` не корректный. Должно быть написано, что носороги НЕ могут быть размещены
- Перебор массивов объектов лучше делать через foreach, тогда можно будет не вычислять длину этих массивов, а просто перебирать все элементы
- Так же не понятно какой итоговый результат мы получаем после вызова функции и как это проверить. Нам же надо наверняка разместить именно всех животных. Если так, то тогда выбрасывание исключений оправдано.

## Каким должен быть код
- Универсальным и легко расширяемым, соответствующий принципам SOLID, без дублирований
- Мы должны иметь возможность легко и быстро добавлять как новые типы животных так и новые виды помещений, без изменения ранее написанного кода
- Логика, свойства и параметры каждого вида животного и помещений должны быть инкапсули́рованы только в этих объектах
- Т.к. каждый вид животного, в свою очередь, может быть разного размера, то логично, что он может занимать и разный объем в помещении, поэтому сделаем возможность указывать объем каждого животного при его создании
- Так же нам нужна связь жесткая животного с помещением, в котором его можно размещать. Поэтому этот признак так же будет указан у каждого вида животного.
- Еще хорошо бы написать Unit-тесты
17 changes: 17 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
install:
composer install

run:
php public/index.php

validate:
composer validate

lint:
composer exec -v phpcs src
vendor/bin/phpstan analyse

lint-fix:
composer exec -v phpcbf src

.PHONY: tests
16 changes: 16 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,22 @@
### Project tests and linter statuses:
[![Main](https://github.com/NONstop5/omcode_test/actions/workflows/main.yml/badge.svg)](https://github.com/NONstop5/omcode_test/actions)

# Тестовое в компанию Omcode

## Задание
- Изучить предоставленный код на Java, понять по коду какую задачу решал разработчик.
- Переписать сначала код на PHP в исходном виде
- Предложить более удачную реализацию, при необходимости

### Requirements
- PHP >= 8.3
- Composer >= 2
- make >= 4

### Installation
> `git clone git@github.com:NONstop5/omcode_test.git`
>
> `make install`

### Launch
> `make run`
25 changes: 25 additions & 0 deletions composer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"name": "igor/omcode_test",
"description": "omcode_test project",
"type": "project",
"license": "MIT",
"autoload": {
"psr-4": {
"App\\": "src/"
}
},
"authors": [
{
"name": "IgorIlyaguev",
"email": "non_2002@mail.ru"
}
],
"require": {
"php": ">=8.3"
},
"require-dev": {
"squizlabs/php_codesniffer": "^3.12",
"symfony/var-dumper": "^7.2",
"phpstan/phpstan": "^2.1"
}
}
Loading