пятница, 27 сентября 2013 г.
четверг, 26 сентября 2013 г.
Substitution Model
Элементы програмирования
Любой нетривиальный язык программирования имеет:
1) элементарные выражения, представляющие наиболее простые элементы.
2) способы комбинирования первых.
3) механизм для абстрагирования сложных и комбинированных выражений под одним именем.
В Scala все выражения, и любое выражение должно превратиться в конце концов в конкретное значение. В Scala за это отвечает Substitution Model, задача этого модуля, циклически выполнять вложенные выражения в друг друга, пока из них не останется конкретное значение.
В функциональном программировании есть две стратегии выполнения(Evaluation Strategy)
1) Call By Value
2) Call By Name
Каждая из стратегий выгодна в разных конкретных случаях. Но чаще всего Scala используется СBV, в большинстве случаев этого оправдано.
Но когда в случае
Любой нетривиальный язык программирования имеет:
1) элементарные выражения, представляющие наиболее простые элементы.
2) способы комбинирования первых.
3) механизм для абстрагирования сложных и комбинированных выражений под одним именем.
В Scala все выражения, и любое выражение должно превратиться в конце концов в конкретное значение. В Scala за это отвечает Substitution Model, задача этого модуля, циклически выполнять вложенные выражения в друг друга, пока из них не останется конкретное значение.
В функциональном программировании есть две стратегии выполнения(Evaluation Strategy)
1) Call By Value
2) Call By Name
Каждая из стратегий выгодна в разных конкретных случаях. Но чаще всего Scala используется СBV, в большинстве случаев этого оправдано.
Но когда в случае
def someOperation(x: Int, y: Int): Int = 1 someOperation(1+2, loop)
Мы зациклимся на втором шаге. Но если второму параметру применить стратегию оценки СBN, то міы спокойно пройдем программу
Чтобы сменить дефолтовую стратегию на СBN, нужно интересуемый параметр объявить:
x: Int - СBV
x:=> Int - СBN
Поэтому предыдущее объявленеи нужно подредактировать:
def someOperation(x: Int, y: => Int): Int = 1 someOperation(1+2, loop)// так бесконечного цикла не будетВ зависимости от реализации функции может быть более выгодной та или иная стратегия.
Ярлыки:
Functional programming,
Scala
воскресенье, 22 сентября 2013 г.
суббота, 21 сентября 2013 г.
Как работает внутри Spring Web Portlet
Перед нашими контроллерами происходит следующее:
0. Первое с чего все начинается это идет вызов одного из методов FrameworkPortlet (обращение вообщето идет в DispatcherPortlet, который расширяет первый, но реализация методов находится в его родителе), в зависимости от фазы портлетного запроса.
// Delegate action requests to processRequest/doActionService.
void processAction(ActionRequest req, ActionResponse resp){..}
// Delegate render requests to processRequest/doRenderService.
void doDispatch(RenderRequest req, RenderResponse resp){...}
void serveResource(ResourceRequest request, ResourceResponse response){...}
void processEvent(EventRequest request, EventResponse response){...}
но все они делают в нутри одно и тоже
{
processRequest(req, resp);
}
1. org.springframework.web.portlet.DispatcherPortlet extends FrameworkPortlet
void processRequest(req, resp) //in FrameworkPortlet
//Получается фаза жизненного цикла портлетного запроса
String phase = (String) req.getAttribute(PortletRequest.LIFECYCLE_PHASE);
//на основании фазы выбирается в условиях подходящий обработчик,
//что является немного странным для меня - зачем все перенаправлять в один
// метод, чтобы потом снова разделять? - например
if (PortletRequest.ACTION_PHASE.equals(phase)) {
doActionService((ActionRequest) request, (ActionResponse) response);
}
// в конце метода не зависимо от успеха, запускается событие что портлетный запрос обработан
this.portletApplicationContext.publishEvent(
new PortletRequestHandledEvent(this,
getPortletConfig().getPortletName(),
request.getPortletMode().toString(),
(request instanceof ActionRequest ? "action" : "render"),
request.getRequestedSessionId(),
getUsernameForRequest(request),
processingTime, failureCause));
2. org.springframework.web.portlet.DispatcherPortlet
void doActionService(req, resp)
HandlerExecutionChain mappedHandler; //получает инстанцию НашКлассКонтроллера
mappedHandler = getHandler(req);
//определяет что за обработчик у нас, выбирая из двух типов либо контроллер у нас расширяет спринговый контроллер, либо помечен аннотациями
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
//например у нас ha instanceof
//org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter
//handleAction потому что у нас фаза Action,
//который внутри делает то, что вызывает ModelAndView doHandle(req, resp, handler),
//проверяет чтобы результат обязательно был null потомучто это фаза Action
ha.handleAction(req, resp, mappedHandler.getHandler());
0. Первое с чего все начинается это идет вызов одного из методов FrameworkPortlet (обращение вообщето идет в DispatcherPortlet, который расширяет первый, но реализация методов находится в его родителе), в зависимости от фазы портлетного запроса.
// Delegate action requests to processRequest/doActionService.
void processAction(ActionRequest req, ActionResponse resp){..}
// Delegate render requests to processRequest/doRenderService.
void doDispatch(RenderRequest req, RenderResponse resp){...}
void serveResource(ResourceRequest request, ResourceResponse response){...}
void processEvent(EventRequest request, EventResponse response){...}
но все они делают в нутри одно и тоже
{
processRequest(req, resp);
}
1. org.springframework.web.portlet.DispatcherPortlet extends FrameworkPortlet
void processRequest(req, resp) //in FrameworkPortlet
//Получается фаза жизненного цикла портлетного запроса
String phase = (String) req.getAttribute(PortletRequest.LIFECYCLE_PHASE);
//на основании фазы выбирается в условиях подходящий обработчик,
//что является немного странным для меня - зачем все перенаправлять в один
// метод, чтобы потом снова разделять? - например
if (PortletRequest.ACTION_PHASE.equals(phase)) {
doActionService((ActionRequest) request, (ActionResponse) response);
}
// в конце метода не зависимо от успеха, запускается событие что портлетный запрос обработан
this.portletApplicationContext.publishEvent(
new PortletRequestHandledEvent(this,
getPortletConfig().getPortletName(),
request.getPortletMode().toString(),
(request instanceof ActionRequest ? "action" : "render"),
request.getRequestedSessionId(),
getUsernameForRequest(request),
processingTime, failureCause));
2. org.springframework.web.portlet.DispatcherPortlet
void doActionService(req, resp)
HandlerExecutionChain mappedHandler; //получает инстанцию НашКлассКонтроллера
mappedHandler = getHandler(req);
//определяет что за обработчик у нас, выбирая из двух типов либо контроллер у нас расширяет спринговый контроллер, либо помечен аннотациями
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
//например у нас ha instanceof
//org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter
//handleAction потому что у нас фаза Action,
//который внутри делает то, что вызывает ModelAndView doHandle(req, resp, handler),
//проверяет чтобы результат обязательно был null потомучто это фаза Action
ha.handleAction(req, resp, mappedHandler.getHandler());
Ярлыки:
Spring,
Spring Portlet MVC
вторник, 10 сентября 2013 г.
Как получить вебконтент
В Java:
В JSP:
String xmlRequest = PortletRequestUtil.toXML(request, response);
ThemeDisplay themeDisplay = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY);
JournalArticleDisplay articleDisplay = JournalContentUtil.getDisplay(
themeDisplay.getLayout().getGroupId(),
articleIdStr,
null,
themeDisplay.getLanguageId(),
xmlRequest);
articleDisplay.getContent();
В JSP:
<%@ page import="com.liferay.portal.kernel.util.WebKeys" %>
<%@ page import="com.liferay.portal.theme.ThemeDisplay" %>
<liferay-ui:journal-article articleId="${articleId}"
groupId="<%= ((ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY)).getPortletGroupId() %>"/>
Ярлыки:
Java,
Liferay,
Liferay 6,
Liferay 6.0.6
пятница, 6 сентября 2013 г.
jMockit. State-based testing and Fakes
Один из двух подходов jMockit
Построено на реализации:
State-based testing не фокусируется на взаимодействии между тестируемым классом/юнитом и его зависимостями, а -- на саммих данных которыми обмениваются обьекты. Тесты пишутся не из перспективы теструемого класса, а с перспективы используемых классов, и не важно юнит это или депенденси. Главное в этим виде тесрирования сделать сверку в конце тестового метода, чтобы наши предположения совпали.
Понятия фейков характерны для интеграционного тестирования, где мы вяжемся на какието внешние сервисы, где мы их имитируем и не зависим от их текущего состояния.
Построено на реализации:
State-based testing не фокусируется на взаимодействии между тестируемым классом/юнитом и его зависимостями, а -- на саммих данных которыми обмениваются обьекты. Тесты пишутся не из перспективы теструемого класса, а с перспективы используемых классов, и не важно юнит это или депенденси. Главное в этим виде тесрирования сделать сверку в конце тестового метода, чтобы наши предположения совпали.
Понятия фейков характерны для интеграционного тестирования, где мы вяжемся на какието внешние сервисы, где мы их имитируем и не зависим от их текущего состояния.
Static Initializer Block
Блок загрженного в JVM класса, который вызывается только один раз до вызова конструктора класса или его метода мейн. Тоесть если мы создаем инстанцию класса, то только в этот момент будет вызван этот блок, все последующие создания обьектов уже этот блок вызывать не будут, таже история с методом мейн.
Правила:
Используется это для:
Правила:
- Код пишется в блоке static { }, который ставится в пределах класса.
- Блок ничего не возвращает -
return. - Никаких обращений к инстанции -
this,super. - Может выкидывать только Unchecked Exceptions( инстанции классов RuntimeException, Error и их наследники).
Используется это для:
- Загрузка драйверов и другого в пространство имен (For example ‘Class.forName(“com.mysql.jdbc.Driver”)’).
- Проинициализировать сложные статические поля класса один раз(final static).
- Логирование.
- Создание и распарсивание подготовленных SQL-выражений.
class Loader {
static final String theName = "The Loader";
static {
System.out.println("Loader.static");
}
Loader() {
System.out.println("Loader.Loader()");
}
}
class Test extends Loader {
final static Integer i;
static {
System.out.println( "Test.static");
i = new Integer(5);
}
{
System.out.println( "Test.non-static");
}
Test() {
System.out.println( "Test.Test()");
}
public static void main( String [] args ) {
System.out.println( "Test.main");
Test t = new Test();
Test t2 = new Test();
Test t3 = new Test();
System.exit(0);
}
}
Loader.static Test.static Test.main Loader.Loader() Test.non-static Test.Test() Loader.Loader() Test.non-static Test.Test() Loader.Loader() Test.non-static Test.Test()
Java создание инстанций из классов Java
Если мы наследуем какой-то класс, то при создании нашего обьекта, если мы явно не вызываем определенный конструктор super([..]); будут вызваны все конструкторы без параметров вверх по цепочке (созданы инстанции каждого предка, чтобы мочь вызывать его методы и пользоваться полями - получается такой класстер инстанций, который воспринимается как одна).
Если у нашего предка, есть контруктор с параметрами и мы при определение наследника не вызываем супером конструктор отца, то компилятор выдаст ошибку - он не знает как создавать инстанцию предка - нужно либо явно вызывать существующий конструтор, либо определить отцовскому классу конструктор без параметров.
Если у нашего предка, есть контруктор с параметрами и мы при определение наследника не вызываем супером конструктор отца, то компилятор выдаст ошибку - он не знает как создавать инстанцию предка - нужно либо явно вызывать существующий конструтор, либо определить отцовскому классу конструктор без параметров.
вторник, 3 сентября 2013 г.
Разработка ПО: факты против мифов
Вот наиболее распространенные мифы и факты, которые их опровергают.
Существует оптимальное, с точки зрения затрат, время выполнения графика для первой поставки. ВРЕМЯ [мес.] = 2,5 (ТРУДОЕМКОСТЬ [чел.* мес.])^1/3. Кривая стоимости резко растет, если запланированный график короче оптимального. Практически ни один проект невозможно завершить быстрее, чем за 3/4 расчетного оптимального графика вне зависимости от количества занятых в нем людей. (Барри Боэм)
Наиболее эффективно программисты работают без жестких сроков. Сверхурочные и авралы снижают общую производительность. (Демарко)
Существуют десятки методологий, но ни одна не гарантирует результат. Коуберн не обнаружил корреляции между успехом/провалом проектов и методологиями, которые применялись в проектах, будь то процессы, сертифицированные по CMMI Level 5 или процессы, построенные по принципу «как получится». Его вывод. Успешность программного проекта на 100% определяется людьми.
Ограниченные усилия могут принести колоссальный эффект. Большинство выдающихся программных продуктов создано студентами «в гараже».
Программист устроен просто. Он состоит из четырех компонентов: тело, сердце, разум и душа. Телу необходимы деньги и безопасность. Сердцу — любовь и признание. Разуму – развитие и самосовершенствование. Душе – самореализация.
Дайте все это вашим программистам, и вы получите максимальную эффективность. Что-то не найдете — уйдут к вашим конкурентам.
Источник: http://habrahabr.ru/post/192396/
Миф #1. Разработку ПО можно ускорить
Девять беременных женщин не родят ребенка за месяц. Добавление людей в отстающий проект только увеличит отставание. (Брукс)Существует оптимальное, с точки зрения затрат, время выполнения графика для первой поставки. ВРЕМЯ [мес.] = 2,5 (ТРУДОЕМКОСТЬ [чел.* мес.])^1/3. Кривая стоимости резко растет, если запланированный график короче оптимального. Практически ни один проект невозможно завершить быстрее, чем за 3/4 расчетного оптимального графика вне зависимости от количества занятых в нем людей. (Барри Боэм)
Наиболее эффективно программисты работают без жестких сроков. Сверхурочные и авралы снижают общую производительность. (Демарко)
Миф #2. Проблемы разработки ПО можно решить при помощи инструментов и процессов
Применение новых инструментов снижают производительность, но если повезет, может ее повысить на 2-20% (Гласс)Существуют десятки методологий, но ни одна не гарантирует результат. Коуберн не обнаружил корреляции между успехом/провалом проектов и методологиями, которые применялись в проектах, будь то процессы, сертифицированные по CMMI Level 5 или процессы, построенные по принципу «как получится». Его вывод. Успешность программного проекта на 100% определяется людьми.
Миф #3. Разрабатывать ПО просто
Много лет только 1/3 проектов укладывается в треугольник: качество-стоимость-срок (Standish Group). Отраслевой прирост производительности составляет 3-5% в год (Демарко). Производительность программистов с похожим стажем и опытом могут отличаться в 10 раз (Брукс) или даже в 28 раз (Гласс).Миф #4. Железный треугольник проекта
Разработка продукта длилась 5 лет вместо одного года. Бюджет проекта был превышен более чем в 5 раз. Это — провал? Нет — это был Microsoft Word!Ограниченные усилия могут принести колоссальный эффект. Большинство выдающихся программных продуктов создано студентами «в гараже».
Миф #5. Работу программистов нельзя измерить
Нельзя измерить работу отдельного программиста. Что будем мерить, то и получим. Но надо измерять работу проектной команды. Обязательно.- Процент протестированных вариантов использования.
- Средняя производительность, SLOC в день на каждого участника проектной команды.
- Дефектность продукта, bugs/KSLOC.
- Качество архитектуры. Предлагаю читателям самим указать единицу измерения, в качестве упражнения.
Миф #6. Программисты анти-бюрократичны
Программисты – анти-идиотичны. Программисты сторонятся тех, кто усложняет их работу. Программисты самоорганизуются вокруг тех, кто облегчает их работу.Миф #7. Программисты работают ради денег
Нет. Не ради денег. Но за деньги. Почувствуйте разницу.Программист устроен просто. Он состоит из четырех компонентов: тело, сердце, разум и душа. Телу необходимы деньги и безопасность. Сердцу — любовь и признание. Разуму – развитие и самосовершенствование. Душе – самореализация.
Дайте все это вашим программистам, и вы получите максимальную эффективность. Что-то не найдете — уйдут к вашим конкурентам.
Источник: http://habrahabr.ru/post/192396/
Подписаться на:
Сообщения (Atom)
