// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Видеодемонстрация функции реорганизации при проверке и преобразовании в IDE NetBeans
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Видеодемонстрация функции реорганизации при проверке и преобразовании в IDE NetBeans - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Видеодемонстрация функции реорганизации при проверке и преобразовании в IDE NetBeans

|===
|На этой экранной демонстрации описывается поддержка новой функции реорганизации при проверке и преобразовании в IDE NetBeans 7.1. В этой экранной демонстрации описывается, как выполнять просмотр кода с помощью проверок с реорганизацией и предопределенного набора проверок, управлять настройками и создавать пользовательские проверки. В этой экранной демонстраниции описывается исопльзование редактора IDE NetBeans 7.1 Java для реорганизации кода в выбранной области файлов.

Автор: Алёна Сташкова (Alyona Stashkova) 
Продолжительность: 9:12

link:http://bits.netbeans.org/media/refactor-nb71.swf[+Смотреть полностью/Загрузить+] (.swf) (Чтобы загрузить видео, нажмите клавишу Ctrl; размер – 9,4 МБ)


link:/about/contact_form.html?to=3&subject=Feedback:%20Video%20of%20the%20Inspect%20and%20Refactoring%20Feature%20in%20NetBeans%20IDE%207%20.%201[+Мы ждем ваших отзывов+]
 
|===


== Связанные ссылки

* link:editor-inspect-transform.html[+Реорганизация при проверке и пребразовании в редакторе Java IDE NetBeans+]
* link:http://wiki.netbeans.org/Refactoring[+Упрощение реорганизации+]
