Возможно, вы захотите взглянуть на пакет angular-input-masks . По-видимому, для реализации требуемой логики используется директива ui-us-phone-number-mask
:
var app = angular.module('myApp', ['ui.utils.masks']);
app.controller('myCtrl', function() {});
Взгляните Структура 101. Потрясающе для визуализации зависимостей и проявления зависимостей повредиться на Вашем пути к более чистой структуре.
Мы недавно выполнили подобную задачу, т.е. проект, который состоял из> 1k исходные файлы с двумя основными классами, которые должны были быть разделены. Мы закончили с четырьмя отдельными проектами, один для основных служебных классов, один для клиентского материала базы данных, один для сервера (проект является rmi-server-client), и один для клиента gui материал. Наш проект должен был быть разделен, потому что другие приложения использовали клиент в качестве командной строки только и если Вы использовали какой-либо из gui классов случайно, Вы испытывали бездисплейные исключения, которые только произошли при запуске на бездисплейном сервере развертывания.
Некоторые вещи иметь в виду на основе нашего опыта:
Два совета: первой вещью, в которой Вы нуждаетесь, являются Наборы тестов. Второй совет состоит в том, чтобы работать в небольших шагах.
Если у Вас есть сильный набор тестов уже затем, Вы находитесь в хорошем положении. Иначе я был бы некоторые хорошие тесты высокого уровня (иначе: тестирование системы).
Основное преимущество тестов высокого уровня состоит в том, что относительно небольшое количество тестов может получить Вас большое покрытие. Они не помогут Вам в точном определении ошибки, но Вам действительно не будет нужно это: если Вы работаете в небольших шагах, и Вы удостоверяетесь, что запустили тесты после каждого изменения, Вы сможете быстро обнаружить (случайно представленный) ошибки: корень ошибки находится в небольшой части кода, изменился с прошлого раза Вы запустили тесты.
Я запустил бы с различных задач, которые необходимо выполнить.
Я недавно столкнулся с подобной задачей, учитывая 15-летнюю кодовую базу, которая была сделана серией разработчиков, у которых не было связи друг с другом (один, работал над проектом, оставленным, затем другой был нанят, и т.д., без перекрестных помех). Результатом является общая путаница совсем других стилей и качества.
Чтобы заставить его работать, мы должны были изолировать необходимую функциональность, отличную от декоративного пуха, чтобы заставить все это работать. Например, существует много различных строковых классов там, и один человек потратил то, что, должно быть, было большим количеством времени, делая 2k преобразование строки между COleDateTime
кому: const char*
и назад снова; это было пухом, код для решения задачи, вспомогательной для главной цели (получение вещей в и из базы данных).
То, что мы закончили тем, что имели необходимость сделать, было, определяют большую цель, которую этот код выполнил, и затем запись основной логики для этого. То, когда была задача, мы должны были выполнить это, мы знаем, было сделано прежде, мы нашли его и перенесли ее в вызовы библиотеки, так, чтобы это могло существовать самостоятельно. Один блок кода, например, активирует драйвер USB-устройства для создания изображения; тот код является нетронутым этим текущим проектом, но названный при необходимости через вызовы библиотеки. Другой блок кода работает аппаратный ключ безопасности, и все еще другой запрашивает удаленные серверы для данных. Это - весь необходимый код, который может инкапсулироваться. Код для прорисовки, тем не менее, был создан более чем 15 лет и такое здание к безумию, что переписывание в OpenGL в течение месяца было лучшим использованием времени, чем попытаться выяснить то, что кто-то еще сделал и затем как добавить к нему.
Я - немного handwavy здесь, потому что нашим проектом был MFC C++ к.NET C#, но основные принципы применяются:
Я надеюсь, что это помогает...
Для продолжения ответа Itay я предлагаю читать Michael Feathers, "Работающего Эффективно С Унаследованным кодом" (PDF). Он также рекомендует каждому шагу быть поддержанным тестами. Существует также версия книжной длины.
Знаток позволяет Вам устанавливать маленькие проекты как детям большего. Если Вы хотите извлечь часть своего проекта как отдельная библиотека для других проектов, то знаток позволяет Вам сделать это также.
Однако определенно необходимо зарегистрировать задачи, что каждый меньший проект выполнит, и затем (как был указан здесь многократно), тест, тест, тест. Вам нужны тесты, которые работают через целый проект, затем имеют тесты, которые работают с отдельными частями проекта, который закончится как дочерние проекты.
Когда Вы начинаете вытаскивать функциональность, Вам нужны дополнительные тесты, чтобы удостовериться, что Ваша функциональность согласованна, и что можно дразнить вход в различные дочерние проекты.