Region C# хорошо или плохо?
Как до сих пор считал, что никакой особой пользы от них нет. Можно конечно придумать ситуацию где будут полезны. Но вот делать их присутствие обязательным?
А у Вас какое мнение?
Польза в регионах есть - ими очень удобно группировать код. Например, если класс имплементирует несколько интерфейсов - я всегда использую регионы. Иногда имеет смысл отделить приватные методы от публичных и/или проперти от методов. Несколько раз использовал даже вложенные регионы :)
Вместе с тем, делать их присутствие обязательным - глупость :)
очень удобно группировать код
Пока что все известные мне случаи группировки сводятся сводятся или к code smell или к ненужности. То есть субъективное желание человека понять как то можно, но вот объективных причин никак не нахожу.
если класс имплементирует несколько интерфейсов
прежде всего непонятно для чего группировать по имплементации интерфейса и чем в этом случае не нравятся partial классы?
приватные методы от публичных и/или проперти от методов
А смысл? Скорее всего чисто для того чтобы новые заносить в нужные регионы.
У меня для этого есть решарпер который все автоматом сортирует как хочется. То бишь вначале идут все публичные по алфавиту, затем приватные и после проперти "с полями"
делать их присутствие обязательным - глупость
это то то меня и смущает. Постоянно открывать все регионы при просмотре файла можно еще как то привыкнуть, но писать и сортировать руками
Пока что все известные мне случаи группировки сводятся сводятся или к code smell или к ненужности.
Ну это твой опыт. Вот пример из моей жизни:
И как мне кажется, region'ы тут использованы к месту :D
прежде всего непонятно для чего группировать по имплементации интерфейса и чем в этом случае не нравятся partial классы?
Это не всегда нужно :) Смотри приведенный пример. Выводить имплементацию IEnumerable и IEnumerator в partial было бы явным перебором. Разбивать на partial имеет смысл, когда есть какое-то сильное логическое отличие. Например, у меня было так, что один тип данных надо было по-разному сериализовать. Вот сериализацию я вынес в partial.
У меня для этого есть решарпер
Решарпер не поставляется вместе со студией и не является стандартом. В то время, что регионы - встроенная фича.
Ну это твой опыт
безусловно, поэтому и интересует другое мнение.
Относительно примера, нужность регионов для меня спорная, больше сводимая к ненужности. Для нахождения ошибки или понятия как работает нужно регионы один фиг раскрывать.
Ну и коде стайл часто не предусматривает группировку по "определенным функциям". Да и при добавлении нового кода нужно поместить его еще и в "правильный регион" -это тоже не всегда прозрачно.
Решарпер не поставляется вместе со студией и не является стандартом
Кому как, возможно поэтому я и не приемлю регионы, рефакторинг уже не срабатывает.
Я себе давно уже купил и нисколько не жалею. Лицензия на программиста, а не на комп.
Как до сих пор считал, что никакой особой пользы от них нет. Можно конечно придумать ситуацию где будут полезны. Но вот делать их присутствие обязательным? А у Вас какое мнение?
мнение у меня есть, но я его не помню. читая такие топики, вспоминается старинная народная мудрость: когда коту нефер делать, он ... задумывается о сущности регионов : )
но лучше "некоторое понимание" - в штудию!
но проблемо, но безусловно, просто просто как личные догадки ни на что не претендующие. С точки зрения того кому это нравится.
Для начала две вещи которые я раньше не знал
-Ctrl/M L открывает все регионы в файле
-если навести курсор мыши на закрытый регион, то можно увидеть первые х-строк содержимого (где то 20-30 думаю)
Если много лет разрабатывать и поддерживать одну часть проекта/проект то то код изучать не нужно, удобнее скорее найти то что нужно.
Ну и если видишь группы типа этих то и искать проще и можно не обращать внимание на группы которые в данную минуту не нужны. А если что, то просто "мышку на регион".
"Кодирование строк"
"Кодирование региона"
"декодер"
"поля"
"публичные методы"
То есть в коде наводится дополнительный порядок. Зачем мне видеть часть "поиск символа" когда я и так наизусть знаю как он там ищется.
Фактически вместо кода получается псевдокод более высокого уровня.
Если много лет разрабатывать и поддерживать одну часть проекта/проект то то код изучать не нужно, удобнее скорее найти то что нужно.
------
Дошло?
Ну а теперь прикинь что использование прописано в полиси.
Например, имплементация интерфейсов обязательно врапируется регионом.
Да, можно и в другой файл, но не всегда удобно...
Аналогично - есть локальные переменные, есть конструкторы, есть паблик методы, есть паблик пропертя...
Для меня быстрее найти метод в регионе, где он должен быть, чем выбрать его из списка методов в Студии.
Не привык пользоваться этой фичей Студии.
Дошло?
неа
Для меня быстрее найти метод в регионе, где он должен быть
Видишь, для тебя, а мне откуда знать в каком регионе должен быть метод? И какой метод вообще нужно искать? И куда пихать новый метод? Гораздо проще когда все автоматом, допустим по алфавиту упорядочено упорядочено. И для каждого файла нужно открывать все регионы.
А то какой смысл в таком файле
public class Abc { Fields <- region Methods <- region
... }
хотя мне приходится только гадать отчего кому то регионы сильно нравятся.
-----
Ну если полиси не читаешь и/или им не следуешь - хрен его знает окедова...
И какой метод вообще нужно искать?
-----
Не знаю. В плане регионов - понятия не имею.
Хотя... где-то в коде есть регионы Сериализация...
Об содержимом, надеюсь, догадаешься сам...
И куда пихать новый метод?
Гораздо проще когда все автоматом, допустим по алфавиту упорядочено упорядочено.
------
Ну да ради бога - удобнее - делай так.
И для каждого файла нужно открывать все регионы.
-----
Зачем?
Мне вот при генерации было важно сгенерировался кусок или пролетел мимо.
Хочешь сказать что мне нужно открывать регионы если известно что кусок обернут регионом?
Содержимое меня как раз не интересует - ели есть - будет правильно...
А то какой смысл в таком файле
------
Помнится, в изначальных Сях была фича - декларировать переменные блока в начале блока.
Потом от нее долго и медленно отходили в сторону произвольного места декларации, далее в автоматичекое создание по месту и т.п.
Ну и какой смысл в сишном коде? А привычка описывать переменные изначально она с досишных времен - у меня - с Фортарна.
Можно еще посмотреть спеки на КОБОЛ - там вообще все прозрачно.
кому то регионы сильно нравятся
-----
Кому-то они упрощают жизнь, кому-то, наоборот, усложняют.
Мне с ними - проще, но предыдущий шеф частенько тер пустые регионы в моем коде...
хрен его знает окедова...
вот именно, для того кто кода не знает...
Нужно знать что есть регион "расчет куку" и что данный метод нужно поместить именно туда. То бишь еще перемещать вручную после автогенерации - потеря времени.
Хотя... где-то в коде есть регионы Сериализация...
для меня это фиговый код, по определению. Для этого должен быть класс "сериализаторХхх" ну или метод расширение на крайняк.
Ну да ради бога - удобнее - делай так.
Так вопрос то не в этом. Как кому удобно - это субъективные причины. Меня интересуют объективные.
И для каждого файла нужно открывать все регионы.
-----Зачем?
Что бы понять какого файл делает. Вот я привел пример кода с "полезными" регионами. Можешь сказать без открытия регионов что делает данный файл?
но предыдущий шеф частенько тер пустые регионы в моем коде...
А зачем нужны пустые регионы в файле? Откуда они берутся и почему это понятно...
------
У меня - четыре региона задаются сразу.
Не факт, что в них что-то будет.
Но если будет - будет в них.
Меня интересуют объективные.
-----
Объективные - надо мерить. Причем - не на одном объекте...
перемещать вручную после автогенерации
-----
Да, тоже задалбывает.
Провда у меня есть куча типового кода, который правится по месту послe копи-пасты...
Нового - мало...
Можешь сказать без открытия регионов что делает данный файл?
-----
У себя - да, приблизительно смогу... но это - у себя...
А зачем нужны пустые регионы в файле?
ты не виляй, а прямо скажи
Откуда они берутся понятно. Зачем нужны "читателю" в настоящее время?
У себя - да, приблизительно смогу
Чисто по имени файла, как баба Ванга?
Какая полезная информация в том, что файл имеет поля, методы и проперти. Притом, еще что регион поля пустой
Чисто по имени файла
-----
Даже БЕЗ имени.
Просто как программист организовавший код понятным ему способом.
Зачем нужны "читателю" в настоящее время?
------
Дам программистский ответ:
Ну если считать основным и наиболее ответственным читалем компилятор - для обработки.
получишь хоть предупреждение ?
-----
Избаловал тебя решарпер.
Что ты будешь делать, когда его разработчики научат его понимать регионы?
Ну нет у меня решарпера. Нету. Потому - поддерживаю код руками - регионы мне в этом помогают...
Не спорю - могут и сильно - если их втыкать от балды - мешать...
Но код, корректно организованный регионами, понимать легче...
П.С. Воткнуть дополнительную обработку текста описания региона с распознаванием некоторого набора слов - не слишком сложно - и будет тебе варнинг...
Но код, корректно организованный регионами, понимать легче...
Ага... нашли плюс, другие говорили читать легче.
Осталось определится что значит "корректно организованный" и кому именно читать легче: автору или всем остальным, как и вносить исправления.
Пожалуй можно начинать составлять таблицу + и -
Вот тебе еще один аргумент за использование регионов.
В тестах. Когда одини и те же методы дергаются с разными рараметрами.
Сгруппировав это безобразие в регион можно упростить восприятие даже не кода, а уровня покрытия тестами.
В тестах у меня регионы даже двухуровневые - помимо следования структуре регионов тестируемого класса еще есть область инициализации...
кому именно читать легче: автору или всем остальным, как и вносить исправления
-----
Если ты полностью полагаешься на реорганизацию и подддержку кода решарпером, который не понимает регионы, то для тебя регионы не полезны.
Для меня, поскольку Я не пользуюсь решарпером и/или аналогичными тоолсами, регионы облегчают понимание и сопровождение кода.
По поводу остальных - ну что толку от регионов... бухгалтеру? Для него что с регионами, что без оных - галиматья из непонятных буковок... Аx, да - с регионами буковок больше...
Удобно. Можно метить код.
Впрочем не-код тоже можно метить.
Вот, пишу себе список того, что надо купить.
Регионами отмечаю места покупок: аптека, пятерочка, космос и пр...
Фишка в том, что регионы поддерживпются большинством моих текстовых редакторов.
Всякие монстры типа Microsoft Word, Excel, OpenOffice, LibreOffice я не использую.
В общем, региони использую как в профессиональной деятельности так и в быту...
Удобно
но это субъективный критерий, который зависит от конкретного человека. Я в поисках объективных критериев. Есть конкретные примеры?
Вот, пишу себе список того, что надо купить.Регионами отмечаю места покупок: аптека, пятерочка, космос и пр...
вот опять субъективность. Для меня данную задачу будет удобнее делать в экзель, по причине того, что можно быстро сортировать по любым колонкам, да и фильтры тоже неплохо.
А так получается, если что вспомнил нужно вписать в нужный регион, а если в двух местах можно купить, тогда как?
Фишка в том, что регионы поддерживаются большинством моих текстовых редакторов.
Тут для меня две странности:
1. Не могу себе представить программирование в текстовом редакторе. Ну типа как на лошади ездить вместо авто.
2. Ни разу не было редактора с данной возможностью. Хотя есть только Notepad++... Ага он поддерживает их, если язык указать.
Как до сих пор считал, что никакой особой пользы от них нет. Можно конечно придумать ситуацию где будут полезны. Но вот делать их присутствие обязательным? шок А у Вас какое мнение?мое мнение что "обязательным" тоже можно сделать, ибо регионы относятся к тому же что и "форматирование текста". Ну типа Табы или Пробелы, фигурную скобку на новой строке обязательно или нет, пробел после запятой делать или нет и подобному...
Т.е. это решение собрания коллег по согласию или желанию начальника, которое "обязательно".
чем в этом случае не нравятся partial классы?пратиал классы вносят небольшой недостаток: не все методы, проперти локализованны в одном файле. Это мелочь, но бывает потратишь лишнюю минуту для поиска чего. В си=плюсах хоть заголовок от этого спасал.
Ради нескольких функций (того же инумератора) не стоит на мой взгляд заводить новый файл, лучше в регион обернуть. Хотя можно и так оставить.
ибо регионы относятся к тому же что и "форматирование текста".
Ну с этим можно видимо до бесконечности спорить и не прийти к согласию.
class Abcd { + [Fields] }
ну вот вижу я например такой текст после открытия файла. Какую полезную информацию он мне несёт? И сокрытие некой части информации никак нельзя отнести просто к обычному форматированию текста.
Ладно можно еще как то понять когда один человек пусть и в команде "владеет" долго какой то частью кода.
Есть даже некоторые конструкции, когда можно согласится с полезностью регионов. Но делать их использование обязательным для каждого файла мне кажется большой ошибкой.
партиал классы вносят небольшой недостаток: не все методы, проперти локализованны в одном файле.
Ну для меня это как раз то и достоинство по сравнению с регионом. Не нужно делать лишних телодвижения для открытия региона. А если что добавлять так точно знаешь куда, потому как все группы перед глазами в списке файлов. Ну и отдельный файл форматируется автоматом без проблем. Да и иметь поля разбросанные по регионам/файлу как то не комильфо.
Обычно я просто пишу имя, а после просто генерирую поле автоматом. В случае с регионами нужно переместить после поле в нужное место.
Notepad++ понимает регионы.
Но я под Windows уже оооочень давно не работаю. Уже забыл как она выглядит. Работаю и живу под AstraLinux.
В качестве редактора кода испольщую Geany или CLion.
Но не только в Source code использую region.
В обычных блокнотных текстах тоже очень катит.
Но всё равно перед тем как сделать новое проперти или функцию - ищу "нужное место".
А смысл? Поля "у меня" в начале класса, проперти в конце (все проперти с "полями"). Решарпер еще автоматом по имени сортирует. То есть сделал, что новое и забыл, еще иногда код также автоматом переформатируется.
Абсолютно весь код получается однообразным без особых усилий. Особенно когда разбираешься с каким то чужим проектом.
А смысл? Поля "у меня" в начале класса, проперти в конце (все проперти с "полями"). Решарпер еще автоматом по имени сортирует.поля я тоже стараюсь в начале класса, за редкими исключениями. Ну группу функций которые связаны вызовами (одна вызывает другую, та третью) стараюсь держать рядом.
Особого смысла нет, но не меньше чем в алфавитной сортировке :). Это сортировка "по темам" получается.
А по-моему, это просто тупая реклама ничем не примечательного (в "общенародной" версии) дебианового клона из Расеи. Фишки же специальной версии обывателю на фиг не упали. С другой стороны, после феерической залепы данного товарища по поводу GPS я уже ничему не удивляюсь...
Ну группу функций которые связаны вызовами (одна вызывает другую, та третью) стараюсь держать рядом
Это может быть удобно когда все один делаешь и не очень сложные классы.
А так постепенно всё разрастается в полный бардак. Согласен что особого смысла сортировки по типу доступа и алфавиту нет, но зато все можно сделать на полном автомате и все понятно без особых объяснений.
1. Не могу себе представить программирование в текстовом редакторе.
------
Регулярно пользуюсь.
Плохо представляю редактирование в пакетном режиме в современных условиях.
2. Ни разу не было редактора с данной возможностью.
------
А текстовый редактор с возможностями колоночного редактирования назвать сможешь?
А с возможностью одновременного редактирования двух разных частей одно и того же файла?
Ну типа как на лошади ездить вместо авто.
------
Угу... Только вот по горной тропке лошадка проходит, а машинка как-то не способна...
Какую полезную информацию он мне несёт?
-----
А какая информация тебе нужна?
Есть таблица, есть релевантный для нее представления бин.
Соответственно, в регионе у тебя лежат переменные под поля таблицы.
Все 300 штук. Ты будешь проматывать эти (7-10)х300 строк или будешь доволен их упаковкой в регион?
Но делать их использование обязательным для каждого файла мне кажется большой ошибкой.
-----
Угу... но это меньшее зло, чем десятки разных способов размещения описания полей.
и все понятно без особых объяснений.
------
Понятен - принцип сортировки.
Функциональнось класса - понять более проблемно, чем когда она описана регионами.
А так постепенно всё разрастается в полный бардак.
-----
Имей полиси и требуй их выполнения - бардака не будет.
Плохо представляю редактирование в пакетном режиме в современных условиях.
а при чём здесь пакетный режим. Зачем мне функции просто редактора? IDE требуется хорошее. При том что даже VS Code не хочется.
А текстовый редактор с возможностями колоночного редактирования назвать сможешь?
нафига?
Только вот по горной тропке лошадка проходит, а машинка как-то не способна...
А если работается исключительно на равнине
Функциональнось класса - понять более проблемно, чем когда она описана регионами.
В идеальном случае да. А в практическом фигвам.
Вот буквально сегодня попался регион "конструктор" где то в конце файла. Ну думаю перенесу в начало, где должен быть.
А там оказалось столько мусора накидано . Могу еще скришот регионов сделать, было бы интересно узнать как они помогут понять что делает класс.
Публичные функции также пришлось искать поиском, а не просто в начале и т.п.
Имей полиси и требуй их выполнения - бардака не будет.
ну да еще пару человек на проверку посадить и самому фиг знает сколько времени тратить на бесполезные вещи.
Если у тебя какие то придурки таблицы делали, то не обязательно, что везде так.
------
А есть разница? По мне так лучше бардачный порядок, порядочный бардак.
Т.е. если оно есть хоть где-то - однообразное оформление кода облегчит работу с ним.
Да и с какого бодуна мне анализировать POCO файлы?
-----
Да хрен тебя знает. Просил пример - привел пример. Теперь спрашивается - кому пример...
А там оказалось столько мусора накидано
------
Ну и причем тут регион как таковой?
Есть регион Конструктор. По идее - должен быть в начале, после Локальные Переменные, и содержать конструкторы (и, возможно, приватные методы, вызываемые исключительно из конструкторов).
Каким образом помещение его в конце и набивка мусором влияет на сам регион? Переименуй его в Мусор Разный и успокойся...
Могу еще скришот регионов сделать, было бы интересно узнать как они помогут понять что делает класс.
-----
Тебе какую солонку - "Ни куя себе!" или "Ай, еп сию мать!"?
Повторюсь - регионы, когда их используют грамотно для группировки кода, помогают.
Когда в коде бардак - там ничего не поможет. Тогда - да, проще иметь методы в алфавитном порядке и без враппинга регионами.
Но не у всех же бардак в коде...
на бесполезные вещи
-----
Ну бесполезные для тебя - не пользуйся.
Повторюсь - мне удобнее с регионами.
однообразное оформление кода облегчит работу с ним.
Во именно так, да и еще на автомате.
Просил пример - привел пример
ну если только для примера, что тебе так нравится.
Но мне получается так, если уж понадобилось смотреть в такой файл, то какой смысл в том, что я увижу там одно слово "поля". Не проще ли сразу все поля увидеть?
Каким образом помещение его в конце и набивка мусором влияет на сам регион? Переименуй его в Мусор Разный
начнём с того что конструктор ожидается где то в начале. Затем, видя название региона я ожидаю там увидеть определенные вещи и поэтому могу и не открыть его.
А какой смысл в переименовании? Какой смысл в данном регионе? Выкинул просто весь мусор из данного региона.
Повторюсь - регионы, когда их используют грамотно для группировки кода, помогают.
никак не могу представить грамотного использования регионов в команде.
-----
Все 3000-5000 строк разом?
Или ты думаешь, что аттрибуты и доки совершенно не нужны? Даже для WCF...
А еще ведь есть и индексы по группам полей... Будешь сортировать по (???) ?
Как то давно генерили код. Много кода.
Иногда в нем надо было что-то проверить. При этом имен нужных функций никто, включая разработчика той части генератора, не знал.
Ну и как? Отсортируем и будем разбираться?
Или все же найдем регион с нужным кодом и поковыряем его?
начнём с того что конструктор ожидается где то в начале.
-----
В начале чего? И кем/чем ожидается?
По спекам - в любом месте... даже в другой части паршил класса.
Какой смысл в данном регионе?
-----
Не надо солодить чай перцем из пачки с названием соль.
Если у тебя не умеют поддерживать порядок в коде - ну у тебя не умеют. Это локальная проблема по квалификации персонала.
А у нас - учили. Сам учил. Быстро и без сложностей. Потому как понимающий вложенные циклы не может не понимать регионы, включая вложенные...
Все 3000-5000 строк разом?
батенька, не надо всё интерпретировать буквально
Если есть класс только с одними полями, то зачем мне их еще и раскрывать.
А еще ведь есть и индексы по группам полей...
Да у тебя там всё не так у "людей". Не было у меня никогда в POCO классах ни атрибутов не индексов, как и кодогенерации.
Вполне могу согласится что в описываемых тобой случаях регионы могут быть полезны. Но эти случаи для меня как бы научная фантастика.
Сегодня нашел еще один аргумент.
Подчищаю либы в свете последних изменению в подсистеме получения данных.
Кода - много.
Исправлений - много. Исправления - многослойные.
Т.е. есть с десяток редакций кода и файлы в разной степени готовности.
Что-то - правлю по минимуму, что-то подгоняю под последние веяния.
Во множестве мест есть инициализация структуры ДатаТабле.
Там - не сложно - выделено в функцию:
- переменная типа ДатаКолумн инициализируется определением колонки
- из переменных формируется массив и разом добавляется к Колумнс таблицы.
Две вещи не устраивают.
1. помещение определения колонки в переменную занимает лишнее время. тесты говорят - существенное.
2. Доступ по имени поля к значению поля в ДатаРов - не самый быстрый - надо индексировать ДатаКолумом.
Не сегодня Я не готов передлать обе вещи.
Переделываю только 1-ю.
Для второй - нужно иметь определения колонок в теле класса.
Но заниматься их использованием для индексации Я сейчас не буду.
Но делать когда-то надо будет. Сейчас - делаю часть подготовки:
- копи-пасте инициализации переменной,
- в полученном куске убирается все лишнее
- кусок помещается в регион
- внутреннее содержимое региона комментится
Получается готовый задел, но он не используется и не мешает.
внутреннее содержимое региона комментится
Если я вижу подобное - убираю немедленно, явно мусор.
Пришлось дебажить код любителя регионов - жуть. Стоишь как перед пропастью.
Обычно то видно что там следующее будет, а с регионами нет, виден вначале текст и только потом все раскрывается и ты попадаешь как бы в новый мир, все нужно искать на экране опять по новому, где был и куда попало.
Ну да, ну да - задел на будущее - явный мусор.
Мы просто с разных позиций на это смотрим.
Ты как единственный разработчик, а я как член команды
Кстати, попутно выявляются и минусы агильной разработки. Нет задач типа "прибрать в коде", значит никто этого делать и не будет.
Нет задач типа "прибрать в коде", значит никто этого делать и не будет.
Значит такая вот у вас "команда", которой на качество своего кода наплевать с высокой башни.
ПО практически никогда не заинтересован в "качестве кода". Две наиболее часто используемые возможности для команды что-то сделать:
1. капать на мозги ПО на каждом рефайнменте и говорить что эту историю можно было бы сделать на 10-20-30-50 процентов быстрее, если почистить код, выбивать себе техническую задачу на рефакторинг.
2. ввести в свой DOD пару правил, вроде "все классы/методы измененные при обработке истории должны соответствовать требованиям для нового кода. Старый код должен быть исправлен."
Значит такая вот у вас "команда"
Вполне возможно что и так, только проблема мне видится гораздо шире.
Вот например, есть файл/класс тысячи так на 3 строк с "большими" регионами внутри, ну или пяток классов в одном файле. Хорошо это или плохо? Ускорится ли производительность разработчиков после того как разнесем регионы или классы в разные файлы? Думаю что до 10% точно не ускорится. Ну или имя класса/намеспасе/функции не правильное.
Сделали исправления, закинули на сервер, на и тут началось... Оказывается есть ветки где правился оригинальный файл и теперь народ просто не может их смержить автоматом, нужно делать всё вручную. А это лишняя потеря времени, а не экономия. Тут то тебя все на дейли и обматерят. Больше уже ни ты ни другие никакого рефакторинга не захотят.
Не думаю что вам проблема видится шире. Скорее она вам как обычно видится чересчур узко - через призму "я так привык, мне так удобно".
Хорошо это или плохо?
Отвратительно. И на одни грабли вы уже наступили лично. Но не заметили. Шанс на то, что один и тот же файл будут править в двух ветках (получая конфликты) понижается, если в нём не будет 3000 строк и 5 классов. Ну а если класс один, то тоже стоит постараться разнести. Разбираться в классе с 3000 строк намного веселее чем в классе с 500 строками. Про кратковременную память и от 5 до 9 объектов слышали?
Ну или имя класса/намеспасе/функции не правильное.
Правильное (соответствующее содержанию) имя класса/функции может ускорить разработку и на 1000%. Вместо 4 часов поисков и выяснений "а почему эта функция называется 'сложитьЧисла' а на самом деле она их перемножает", код правится за 5 минут.
Что за боязнь "мержить вручную"? Две минуты потерять? Или классы настолько загажены, что в них строки по 2 тысячи символов и вообще ничего не понятно?
А что за vcs? В git-е таких проблем нет. Переименуете файл и класс внутри в одной ветке, в другой правите содержимое класса, всё смёржится автоматом.
Больше уже ни ты ни другие никакого рефакторинга не захотят.
Ну, повторюсь, вот такая у вас команда. Которая не умеет мёржить, боится переименовывать и лучше поковыряется в коде с непонятными именами. Вас в Ирландии один завод ждёт :)
Но если вам так удобнее, то кому какое дело - работайте так.
Ты как единственный разработчик, а я как член команды
-----
Извини - не понимаю команду, но могу понять членов...
Когда-то была большая проблема в команде - все писали и никто не хотел отвечать за им же написанный код.
Типа как у вас - получил задание - написал - закинул в СВН/ГИТ/ВСС и... в кассу...
Когда дошло до предела - решили просто - версия в СВН - основная - должна компилятся по выборке.
Крику было много, но в конце-концов начали изменения маркирвать и чужой код не трогать.
И на одни грабли вы уже наступили лично. Но не заметили...если в нём не будет 3000 строк и 5 классов.
про плохое наследство слышали? Что дали то и везем.
Что за боязнь "мержить вручную"?
в две минуты никак не укладывается. С одной стороны АБС, с другой АС, какая сторона правильная? При этом АБС например в строке 50, а АС в строке 250 вместе функцией.
В git-е таких проблем нет
Написать описания шагов для гарантированного получения проблемы?
Ну, повторюсь, вот такая у вас команда
Решения? С текущим составом....
про плохое наследство слышали? Что дали то и везем.
Приходилось, да. "Это моя профессиональная обязанность... Професьон де фуа!" (с) Только задача у меня другая. Что дали то и исправляю. Без мержебоязьни. Вот, в прошлом тикете заменил в интерфейсе (и соответственно всех имплементациях) гуавовский optional на java.util.Optional. Пара конфликтов при мерже решилась за минуту. Никаких проблем.
в две минуты никак не укладывается. С одной стороны АБС, с другой АС, какая сторона правильная? При этом АБС например в строке 50, а АС в строке 250 вместе функцией.
Какой вариант "правильный" надо решать поговорим с другим разработчиком. В первый раз в 2 минуты не уложитесь, не страшно, научитесь. Потом быстрее будет.
То что в одном месте AБС а в другом АБ во-первых не даёт автоматом мёрж конфликта, во-вторых заставляет двух разработчиков поговорить друг с другом, а в третьих вообще может быть правильно.
Написать описания шагов для гарантированного получения проблемы?
Если хотите, да. Так то изменения в строке 50 и 250 мержатся без конфликтов (но могут привести к некомпилируемомоу коду, да)
Решения? С текущим составом....
Повторюсь: "Но если вам так удобнее, то кому какое дело - работайте так."
Так что для начала вы должны всей командой определиться как вы дальше жить хотите. На следующей ретроспективе, например. Если решите что текущее положение дел вас (большинство) не устраивает тогда и поговорим.
"Type" vs "var"
-----
Да нет этой темы. Есть хуливара на тему. А темы - нету.
"Тыпе" - сразу понятно какая функциональность доступна. Ошибки времени компиляции.
"Вара" - фиг его знает что там, но должно работать. Ошибки времени выполнения.
Ошибки времени выполнения меня не устраивают - будет строгая типизация. Все.
Какой вариант "правильный" надо решать поговорим с другим разработчиком.
А с каким именно, как его быстро найти? И это не пара человек в одном офисе.
Только задача у меня другая. Что дали то и исправляю.
Вот именно что задача другая . А что бы вы сделали с членом команды который делает всё по теории правильно, но постоянно создает проблемы другим?
Если хотите, да.
пока по быстрому, что идея была понятна
file1
f1()
{
a+b
}
f2()
{
a*b
}
file2
f2()
{
a*b*c
}
FuncA()
{
...
}
f1()
{
a+b-1
}
Вот жеж...
От предыдущего разработчика мне, единственной в проекте, достались эти регионы. Решарпера нет (да что уж там, даже лицензию на меня приобрести пожмотились). Так вот, я сперва от этих регионов тоже плевалась, ибо понять логику - это пройти пошагово код, и тут постоянные "внезапно открывающиеся регионы" и вопрос в голове "откуда это?!?!". Но за год настолько привыкла к этим регионам, что только прочитав тему, вспомнила, что можно же еще и партиал классы использовать. Сейчас уже не возникает проблем, "где что искать" и "куда пихать новую функцию". Даже автоматически сгенерированные не влом перетаскивать в "привычный" регион!)))
Но если б это была обязаловкой, я б тоже, мягко говоря, удивилась :)
А с каким именно, как его быстро найти? И это не пара человек в одном офисе.
Ну, с тем кто внёс изменения, которые приводят к мёрж конфликту. Смотрим какой коммит последним менял строку, смотрим автора коммита. Профит.
А что бы вы сделали с членом команды который делает всё по теории правильно, но постоянно создает проблемы другим?
1. Поговорил 2. Запретил ему мёржить в мастер (другие могут замёржить его ветку после ревью, приват свой код пока ревьюер не будет доволен). 3. Убрал из команды 4. Уволил
пока по быстрому, что идея была понятна
Ааа.. Понял. Жертва решарпера. А не надо код во всём файле пересортировывать, если 2 строчки меняете. С точки зрения гита вы поменяли не "50-ю и 250-ю строку" а "все строки с 1 по 3.000" Keep your changes small and comprehensible.
пока по быстрому, что идея была понятна
1) у тебя изменены все строчки, кроме фигурных скобок
2) кто и зачем менять порядок функции?
3) даже такое изменение можно сравнительно легко замерджить BeyondCompare'ом :) странно, что вы разорились на решарпер и не разорились на действительно полезное приложение :)
Но за год настолько привыкла к этим регионам
Не знаю что будет через год, но пока отрицательные эмоции не убавились. Просто дрожь пробирает когда надо разбираться в коде любителя регионов.
У него каждый log.Debug обвернут в регион и почти каждая функция,... в которой еще по несколько регионов. Брр.
да что уж там, даже лицензию на меня приобрести пожмотились
я эту проблему решил просто. Дома без любимых тулз тоже фигового и когда по проектам работал, ломало постоянно просить шефов.
Купил персональную лицензию. На все тулзы лицензия на разработчика+коммерческое использование.
Я думаю, что партиал не может быть заменой регионам
В общем случае безусловно нет. Но есть любители делать большие классы, а в них регионы "обработка прямоугольников", "обработка окружностей" и т.п. Вот именно для этого случая. Как первый шаг.
Теперь просто открываешь нужный файл и делаешь все что хочешь, при этом всё видно прямо в дереве солюшина, какие есть "регионы".
Смотрим какой коммит последним менял строку
и как его быстро найти? Среди многих, многих коммитов? Когда даже для того чтобы найти свои изменения приходится делать фильтр по ветке и по коммитеру.
1,2,3,4...
ну и кто захочет иметь подобные проблемы, чтобы делать всё "правильно"?
Жертва решарпера
отчего именно жертва? В "правильном" коде таких проблем не возникнет. Это проблема первого прохода, когда везде бардак.
Да даже и вручную такое может быть когда начинаешь существующие регионы анализировать.
функция,... в которой еще по несколько регионов. Брр.ну это уже перебор. Меня "бог миловал" - ни разу не видел чтоб внутри функции регионы были.
Наверно это делают те что не любят функции и в результате они у них функция в 10000 строк разбитых на регионы.
Я же люблю функции, поэтому предпочитаю чтоб функция никогда не вмещала больше строк чем вмещается в экран (и это крайний случай, а чем она меньше тем лучше).
ни разу не видел чтоб внутри функции регионы были.
я раньше тоже. А тут попался любитель который почти всё систему сделал. Но видимо раньше уже разборки были, потому как он мне тоже регионы сиильно предлагал.
Но сразу отстал, как понял что я не любитель сего дела.
Функции не такие уж и большие, но регионы везде где только можно, если не забуду примерчик скопирую.
Да вот, в начале функции лог и в конце лог и оба в регионах. Похоже у него регионы вместо комментариев.
потому как он мне тоже регионы сиильно предлагал.видимо это мышление такое.
По идее, хорошо ли это мышление нужно судить только по результату. (работает ли программа) и по мобильности (легко ли и быстро автор может модифицировать код без сайд эффектов).
Мне конечно такой код представляется не мобильным. Но может только потому что у меня другое мышление?...
....
У меня на работе есть один милый коллега (весьма приятный человек, итальянец). Но функции пишет в 10000 строк. Правда и мобильным его не назовёшь. Он мне сам сказал прямым текстом, что никогда не делает новых функций, а просто дописывает код внутри уже существующих.(а у меня мнение другое - любые изменения по возможности оформлять в виде вызовов новых функций).
Беда только, что мне бывает приходится в этом (пардон, говно-)коде разбираться. Если бы только он сам его сопровождал - флаг бы ему в руки!
Еще его любимый шпрух: Невер тач раннинг сустем. Поэтому изменения с репозиротия он берет чем реже тем лучше, чтоб не навредить своей работе.
Я же предпочитаю брать апдейтить с репозитория почаще (минимум раз в день).
У нас разные мышления!
Но есть любители делать большие классы, а в них регионы "обработка прямоугольников", "обработка окружностей" и т.п. Вот именно для этого случая. Как первый шаг.Теперь просто открываешь нужный файл и делаешь все что хочешь, при этом всё видно прямо в дереве солюшина, какие есть "регионы".
Ага, а потом у тебя дерево вида:
SomeClass.cs
SomeClass.Rect.cs
SomeClass.Circ.cs
SomeClass.Private.cs
SomeClass.IEnumerable.cs
SomeClass.ISomeOtherInterface.cs
и еще десяток файлов, которые при этом имеют кучу перекрестных ссылок. Разбираться в таком будет то еще удовольствие ;) Уж лучше регионы :D
У него каждый log.Debug обвернут в регион и почти каждая функция...
------
Слишком хорошо - тоже не хорошо.
Ты же не будешь говорить, что код написанный по лексеме на строку является не рабочим?
Но читать - не удобно.
А логер у меня тоже обернут в регион. Единственное - не завернул каждый log.Debug v #if DEBUG.
всё видно прямо в дереве солюшина
------
Я тут как-то приводил свой подход к данной проблеме:
- общий партиал (не намеспасе) класс.
- по-функционально - внутренние классы, каждый в своем файлике.
Непривычно... иногда сам путаюсь... но много удобнее всего виденного.
Разбираться в таком будет то еще удовольствие
-----
А что мешает сунуть всю группу в отдельную папку?
У меня - 700+ таблиц и требуется столько же их представлений в ДАЛе.
Плюс - СКЛ - со старым Ораклом ЕФ6 не работает.
Плюс - бизнес-объекты
Плюс - компоненты бизнес-объектов.
Плюс...
Если это все лежит в корне солюшена - мрачно. А по папочкам - не так уж и страшно.
Тогда получится миллио папок :D Потом тоже фиг найдешь где что :)
-----
Так вариантов то не много.
1. Нарушать ООП и пихать все в один файл
2. Следовать ООП и иметь много файлов в солюшене
3 Следовать ООП и иметь файлы в папках.
4. 3 плюс раскидать папки по дллкам.
Между просто много файлов в куче и раскиданными по папкам Я все же выберу папки и буду думать над их организацией - как поименовать, как вложить, в какую дллку пихнуть...
Пойми - у меня действительно много кода и код достаточно плохой - мне нужна более-менее прозрачная организация переработанных частей.
Потому есть иерархия и группировкa:
- Ордера
- - Ордера.Таблица.цс
- - Ордера.Строка.цс
- - Ордера.Выборка.цс
- - Ордера.ИменаПолей.цс
Надо надстроить? Можно ЛИНКом, но делаю:
- - УникальныеОрдера
- - - УникальныеОрдера.Уникальные.цс
- - - УникальныеОрдера.Строка.цс
- - - УникальныеОрдера.Выборка.цс
- - - УникальныеОрдера.ИменаПолей.цс
Пишется не долго (копи-пасте с редактированием) и мне не надо ползать по всему солюшнику - все кучкуется.
Часть ошибок в исходном коде отловил только за счет организации кода и еще часть за счет строгой типизации - бралось не то и не оттуда.
и как его быстро найти? Среди многих, многих коммитов?
"Ой, всё!" (ц) git blame В большинстве гуёвых клиентов тоже легко смотрится. Секунд так за 5. Проблема, конечно, если ваш решарпер в каждом коммите все строки меняет. Тогда ничего не найдёте.
огда даже для того чтобы найти свои изменения приходится делать фильтр по ветке и по коммитеру.
Вы, простите, какой-то ерундой маетесь. git log --author="vasja" что, слишком сложно? А! Я вспомил. У вас же ещё консолебоязнь... Тогда разбирайтесь как это в вашем гуёвом приложении работает.
ну и кто захочет иметь подобные проблемы, чтобы делать всё "правильно"?
Не вы. Вы не хотите и не делаете. Пожалуйста, ваше право. Просто перестаньте постоянно рассказывать как не работает то что вы не понимаете и не делаете.
отчего именно жертва? В "правильном" коде таких проблем не возникнет.
Ага. А правильный код - это код, который меняете только вы, понимаю.
Два разработчика переименовывают каждый по одной функции одного и того же класса. Каждый в своей ветке. Что тут неправильного? С чем работал, то и переименовал. Без вашей решарповской сортировки такие изменения отлично автоматически смержатся.
P.S. Извините, что-то я сегодня особо злобный, достали-с.
Спасибо за идею, хотя история файла дает гораздо приятный результат а
git blame
http://de.gitready.com/beginner/2009/02/23/finding-who-com...
А вот какая польза от "git log" так и не дошло
$ git log --author="vasja" commit aceed529a5cbdc68740839c3e63aelle41706974 (HEAD -> feature/BranchName, origin/feature/BranchName) Author: Xxxx Date: xxx Commit name1 commit 4fa2b870delac921cl3e2a33b5a376ede6235e51 Merge: ba60f6519 b73c51580 Author: Xxx Date: xxx Merge remote-tracking branch ’origin/BranchName2’ into Release/2.2.20 commit ba60f6519cle7fle6c7821bc5bdl630b903d980b Merge: 801d6886d abf7d0516 Author: Xxxx Date: xxx Merge branch ’Release/2.2.20’ of yyyy into Release/2.2.20 commit 801d6886d6641ac9ce7551f390fbdflf43fd9b5e Merge: fee0f546b 38c60151b :...skipping... commit aceed529a5cbdc68740839c3e63aelle41706974 (HEAD -> feature/BranchName3, origin/feature/BranchName3) Author: Xxxx Date: xxx Commit name2
Не вы. Вы не хотите и не делаете
Что то у вас странная позиция, я ведь всего лишь рассуждаю о проблеме. Буквально сегодня заменил десяток функций одной "генерик", но только потому, что знаю в этих файлах никто копаться сейчас не будет.
Ну невозможно изменить только пару строк чтобы привести данный кусок в "порядок".
Ага. А правильный код - это код, который меняете только вы, понимаю.
Какие то понятия у Вас неправильные. "Правильный код" - соответствует неким общепринятым правилам. Кто его написал не имеет особого значения.
Без вашей решарповской сортировки
Так проблема совсем не в решарпере, это был просто пример. Если исходные классы далеки от идеала, то изменить пару линий можно только исправив ошибку и больше ничего не трогать. А если трогать, то файлы будут практически разные.
По идее, хорошо ли это мышление нужно судить только по результату. (работает ли программа) и по мобильности (легко ли и быстро автор может модифицировать код без сайд эффектов)
На результат особо жаловаться не приходится, как и назвать это говнокодом. Он все же "мама" проекта.
ни разу не видел чтоб внутри функции регионы были.
Ну вот кусочек подобной функции
#region Add each top directory separately to zip to display backgroundworker progress foreach (string topDirectoryPath in Directory.GetDirectories(CurrentSessionLabelingSessionDirectory, "*", SearchOption.TopDirectoryOnly)) { if (backgroundWorker == null || !backgroundWorker.CancellationPending) { #region Compute percentage in size for each folder in top directory float subDirectorySize = ComputeFolderSize(topDirectoryPath); int percentage = (int)(90 * (subDirectorySize / sessionFolderSize)); // 5% at init, other 5% are added on finish #endregion AddDirectoryToZip(zipArchive, topDirectoryPath); #region Update progress for BackgroundWorker progress += percentage; if (progress > 95) { progress = 95; } backgroundWorker?.ReportProgress(progress); #endregion } } #endregion
У BeyondCompare есть "Align with"
Ну безусловно, что этого я не знаю
Есть даже поиск по "левой" половине и по "правой".
Алгоритм лучший есть?
- Копируем заголовок функции
- Запоминаем номер строки слева
- Стартуем алигн
- Ищем в правой половине нужную функцию
- Оканчиваем алигн
- Ищем запомненый номер строки слева на экране
- Часто приходится "выравнивать" и что то посередине функции
Ну оторвали. А кто кодить будет? :)
Не решается проблема таким методом. Что-то можно сделать написав и требуя соблюдения полиса. Что-то - подбирая примрно равные по квалификации кадры. Что-то - правильным разнесением задачь...
У меня сейчас тоже стоит похожая проблема - дофига некомитченного кода - нельзя коммитить - тесты деструктивные, а ЦИ - глупый - будет гонять на их на живой базе... надо дописывать, а времени на это нет... все накапливается... чую, что закончится все переходом в новый репозиторий - так будет проще разрулить ситуацию...
Ну оторвали. А кто кодить будет? :)
Тот, кто не будет заниматься херней переставляя функции :)
У меня сейчас тоже стоит похожая проблема
Ну у тебя там вообще клинический случай :) Так что твой пример можно приводить только в качестве "как не надо делать" :)
дофига некомитченного кода - нельзя коммитить - тесты деструктивные, а ЦИ - глупый - будет гонять на их на живой базе...
Ну это не проблема тестов :) Это проблема того, кто эти тесты написал. Т.е. у того, кто писал эти тесты просто нет понимания того, что должно быть протестированно. Ну и плюс к этому (возможно) еще сколько-то там гигабайт нетестируемого легаси кода.
кто писал эти тесты просто нет понимания того, что должно быть протестированно
-----
Понимание - есть - возможности - нет.
Ну и плюс к этому (возможно) еще сколько-то там гигабайт нетестируемого легаси кода.
-----
Там много... ну и покрытие тестами недостаточное...
Блин, текущая проблема - репорт 4-й - что-то с инвойсами.
Вместо нормального скл-ного ТРАНСФОРМ написан кусок строящий таблицу и заполняющий ее данными. Получение данных - 10 минут...
Блин, постоянные сбои на индексировании строки данных валютой платежа - для текущей валюты введены не все колонки: для всех - 5, для текущей - 3.
третий подход - с первых двух где-то год и полтора назад - сорвали... Успею ли сейчас, до очередного срочного вызова - ХЗ.
Будет вызов - повиснет гамно снова и надолго...
хотя я все таки думаю, что нет понимания
------
Ну думать тебе никто не мешает.
Ну так а почему оно недостаточное?
-----
Ты бы спросил - почему 5 лет назад его вообще не было и прогер свихнулся...
Сижу. Ковыряю 4-й репорт на предмет индексации полей в одной табличке.
Подходит шеф и спрашивает - Я тебе послал е-майл - 60-й репорт падает - что делать?.
Он реально не компилируется:
Exception message:
C:\inetpub\wwwroot\Reports\r60.aspx.vb(50): error BC30002: Type 'TGridView_R32'
is not defined.
В чем причина, если:
- работ на сервере не производилось, за исключением виртуализации
- случается не первый раз
- чинилось перезагрузкой
- не починилось перезагрузкой в этот раз
- либа с классом TGridView_R32 - на месте, в BIN папке.
почему сервер не видит класса в скомпилированной либе? Все - видит, а это - никак...
Ну и главный вопрос - бросить 4-й как есть и чинить 60-й? Или довести до ума 4-й и потом начать жевать 60-й?
Получается, что если начать делать правильно, то все остальные будут только ругаться.
Может быть я чего-то не понимаю, но правильно - это не менять порядок функций :)
И, соответственно, тот, кто меняет порядок функций делает не правильно, а значит заслуживает отрывания рук :)
У нас в команде есть один такой чудила, он любит переименовывать переменные. Ну типа из name сделает strName или FileName или еще что-нибудь. В результате хренова туча конфликтов в мердже. И хоть кол ему на голове теши! Каждый раз хочется убить. И я еще понимаю, когда исправлена орфоргафическая ошибка в имени или новое имя лучше описывает суть... но он просто меняет внешний вид (при этом, по моему мнению, не в лучшую сторону).
И хоть кол ему на голове теши!
-----
Не надо кол. Достаточно посадить на мержи и назначить выпускающим. Ну а время на задачи оставить как было. За неделю вылечится.
Ну и это... у вас в полиси правила построения имен хоть как-то обозначены?
У меня в коде полно переменных поименованных DT... & DR... - преставляют ДатаТабле и ДатаРов.
Вроде должно быть понятно... но вот на 3-4-м десятке начинаешь путаться какая таблица, какая строка...
А в купе с тем, что одна и та же переменная может хранить разные таблицы/строки или формат
таблиц/строк в процессе меняется - получается... прямой путь в клинику...
Достаточно посадить на мержи и назначить выпускающим. Ну а время на задачи оставить как было. За неделю вылечится.
Как ты посадишь его мерджить незнакомый код? :) Впрочем, мы обычно мерджим через несколько месяцев после написания кода, так что большой разницы нет :D
В любом случае, я не шеф и назначить его не могу.
у вас в полиси правила построения имен хоть как-то обозначены?
Жестких полиси нет. И шеф не хочет вводить запрет на изменение имен переменных.
Как ты посадишь его мерджить незнакомый код? :)
-----
Так в этом ВЕСЬ смысл - в настоящее время чел не понимает какую работу заставляет делать коллег.
Поделает ее сам - поймет - будет рабоатть как надо.
И шеф не хочет
------
Так ни запрет, ни чего такого стремного и не нужно.
Нужно просто иметь правила поименования и требовать их соблюдения.
Про венгерскую нотацию написано много.
А вот у меня она не прижилась. Как-то не вижу неоходимости указывать префиксом тип там, где все элементы сильно типизированны.
"Type" vs "var"-----Да нет этой темы. Есть хуливара на тему. А темы - нету. "Тыпе" - сразу понятно какая функциональность доступна. Ошибки времени компиляции."Вара" - фиг его знает что там, но должно работать. Ошибки времени выполнения.
ты кажись не понял, что такое var.
Так у вас водопад и маленькая команда?
У нас не водопад, но таки маленькая команда. И шеф, который пытается понять как работает код. Он дает добро на мердж только в 2-х случаях:
1) когда понял изменение (должно быть изменено не больше 50-100 строк, если больше, то он подвисает очень надолго :))
2) когда клиенты пинают его шефа и его шеф вставляет звиздюлей. В этом случае понимания кода не требуется, а пару раз мерджели даже без тестирования (при этом код был готов месяца 2-3 до мерджа) :D
Вот буквально только что я замерджил изменение, которое было завершено на бранче в начале июня. При этом я точно знаю, что в некоторых местах там есть проблемы. Забавно, что один из системных тестов красный (на самом деле
это из-за того, что ошибка была всегда в мастере, а я ее пофиксил. т.е. это тот редкий случай, когда надо править ожидание теста) из-за этого не срабатывают юнит-тесты, т.е. по большому счету у нас нет доказательств того, что все ОК. Более того, я завтра последний день перед отпуском, и на фирме остается шеф, который не понял изменения, и джуниор разработчик, который тоже не до конца понял изменения. И все это добро планируют установить на боевой системе во время моего отпуска :) А все из-за того, что шефу таки настучали по голове и потребовали срочно решить проблему. Вот так и живем :)
где то в стайл гайде мелкософта
------
Читать гайды от мелкомягих? Мне хватает кода написанного в точном соответствии с примерами мелкомягких - если на описано, а у меня не описано, что и как делается - фиг разберешся без поллитры что там...
Текучка:
грузится табличка из базы. Табличка в базе - может быть отредактирована в любой момент.
на основании полученных данных - строится набор ДатаКолумнов и добавляется в другую табличку
по этой другой табличке строится третья - с удалением и добавлением полей
все это написано именно в стиле примеров мелкомягких:
Private Function createReport(ByVal startDateTime As String, ByVal finishDateTime As String) As DataSetDim DS As New DataSetDim DTOptimisations As DataTable = NothingDim DTReplacements As DataTable = NothingDim DTPieces As DataTable = NothingDim DTNUM_KREIS As DataTable = NothingDim DTLIPROD_USER As DataTable = Nothing'Dim DTDisplay As DataTable = NothingDim DTSummary As DataTable = NothingTryDTOptimisations = DXCR8.loadDTOptimisations(startDateTime, finishDateTime)DTReplacements = DXCR8.loadDTReplacements(startDateTime, finishDateTime)DTOptimisations.Merge(DTReplacements)If DTOptimisations.Rows.Count > 0 ThenDTNUM_KREIS = DXCR8.loadDTNUM_KREISDTNUM_KREIS = loadDTNUM_KREIS_abbreviateDepartment(DTNUM_KREIS)DTLIPROD_USER = DXCR8.loadDTLIPROD_USERDTOptimisations = addColumnsDTOptimisations(DTOptimisations, DTNUM_KREIS)DTOptimisations = DTOptimisations.Select("", "batchNo, glassNo").CopyToDataTableFor Each DROptimisation As DataRow In DTOptimisations.RowsIf DROptimisation.Item("batchNo").ToString = "3041312" ThenDROptimisation.Item("batchNo") = 3041312End IfIf DROptimisation.Item("seqNo").ToString = "-3" ThenDTPieces = DXCR8.loadDTPiecesDummy("800001", DROptimisation)ElseDTPieces = DXCR8.loadDTPieces(DROptimisation)End IfIf DTPieces.Rows.Count > 0 ThenDTPieces = DTPieces_setDepartment(DTNUM_KREIS, DTPieces)DTPieces = DTPieces_setDepartment_exceptions(DTNUM_KREIS, DTLIPROD_USER, DTPieces)DTPieces = DTPieces_setDepartment_replacements(DTNUM_KREIS, DTLIPROD_USER, DTPieces)DROptimisation = fillDROptimisation(DTPieces, DTNUM_KREIS, DROptimisation)End IfNextDTOptimisations = fillDTOptimisation_combinedGlassNames(DTOptimisations)DTOptimisations.Columns.Remove("sheetWidth")DTOptimisations.Columns.Remove("sheetHeight")DTOptimisations.Columns.Remove("seqNo")DTOptimisations.Columns.Remove("timestampIndex")DTSummary = loadDTSummary(DTOptimisations)Me.ViewState.Item("DTOptimisations") = DTOptimisationsMe.ViewState.Item("DTSummary") = DTSummaryPNL1AddGV("GVDisplay", "Stock Sheet Usage", DTOptimisations)PNL1AddGV("GVSummary", "Stock Sheet Summary", DTSummary)End IfCatch ex As ExceptionEnd TryReturn DSEnd Function
Найдешь, с плутыка, где и как менается структура двух таблиц?
Вопрос второй - нахрена пустой DS возвращать?