GithubHelp home page GithubHelp logo

ios-sdk's Introduction

TestAssignmentMindbox

Задание

Напишите на swift код для поставки внешним клиентам, который позволяет вычислять площадь круга по радиусу и треугольника по трем сторонам.

Дополнительно к работоспособности оценим:

  • Юнит-тесты
  • Легкость добавления других фигур
  • Вычисление площади фигуры без знания типа фигуры в compile-time
  • Проверку на то, является ли треугольник прямоугольным

Реализация

Так как код нужен для поставки внешним клиентам, то проект создал как Framework. Протоколы фигур объявлены как public, чтобы их можно было реализовывать в других Target.

Покрыл код Unti-тестами. ShapeTests отвечают за проверку вычисления площади фигуры без знания типа фигуры в compile-time. Реализовано вычисление площади без знания типа фигуры в compile-time при помощи протоколов, которые позволяют достигать полиморфного поведения. Предпочел структуры классам, так как преимущества в виде иммутабельности и потокобезопасности с производительностью в данном контексте выглядит лучше. Но также вполне можно реализовать фигуры как классы с модификатором доступа open, чтобы можно было в других таргетах их наследовать.

Добавлено свойство var isRightAngled: Bool { get } в TriangleProtocol для проверки, является ли треугольник прямоугольным.

Обе фигуры реализованы при помощи Failable initializers, так как круг не может существовать при минусовом радиусе, а треугольник с определенными сторонами также не может существовать. Изменил Failable initializers на init throws, так как кажется удобнее получать ошибку и её вернуть пользователю, который сможет её обработать, чем просто вернуть nil.

Добавлен протокол FormattableAreaProtocol с дефолтной реализацией методов для вывода округленных значений до 2-х знаков после точки. Этот протокол также подписан на ShapeProtocol для того, чтобы в дефолтной реализации можно было использовать свойство area.

Отказался от реализации Generic с использованием FloatingPoint, так как ассоциированные типы в протоколах сильно усложняют использование протоколов напрямую в качестве типов. Но можно с этим поработать при помощи ключевого слова any для обозначения экзистенциальный типов.

ios-sdk's People

Contributors

justsmk avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.