Должен ли я разделить логику Dispose в частичном файле класса? - PullRequest
2 голосов
/ 10 февраля 2009

При рефакторинге некоторых классов C # я столкнулся с классами, которые реализуют IDisposable.

Недолго думая, я создал частичные файлы классов для каждого класса, который реализует интерфейс IDisposable.

Например.) Для Stamper.cs -> Stamper.cs + Stamper.Dispose.cs где Stamper.cs содержит актуальную логику для штамповки и Stamper.Dispose.cs , который содержит логику удаления

// Stamper.cs
public partial class Stamper
{
// actual logic
}

// Stamper.Dispose.cs
public partial class Stamper: IDisposable
{
// Implement IDisposable
}

Когда я посмотрел на код, Stamper.cs теперь выглядит намного чище и удобочитаемее (теперь около 52 строк вместо 100 строк, где около 50 строк было просто кодом очистки)

Я захожу слишком далеко с этим?

* РЕДАКТИРОВАТЬ : Спасибо, ребята, за ваше мнение - я решил собрать два файла в один. Проблема, с которой я столкнулся, заключалась в том, что я фактически забыл обновить реализацию IDisposable после обновления фактической логики.

Кроме того, не было особых проблем с перемещением между методами в исходном коде. Первая причина кажется более чем достаточной, чтобы придерживаться одного решения для файла в моем конкретном случае.

Ответы [ 8 ]

8 голосов
/ 10 февраля 2009

Да, слишком далеко. Что плохого в том, чтобы просто прикрепить #Region вокруг кода и свернуть его, чтобы вы не могли его увидеть?

7 голосов
/ 10 февраля 2009

Это выглядит примерно так же произвольно, как создание частичного класса для логики конструктора. Теперь мне нужно взглянуть на два файла, чтобы найти этот класс. Частичные занятия действительно стоят только для дизайнерских вещей ...

6 голосов
/ 10 февраля 2009

Я бы предпочел видеть логику утилизации в том же файле, что и ресурсы, которые требуют реализации IDisposable. Хотя есть элемент субъективности, я бы сказал, что это слишком далеко

2 голосов
/ 10 февраля 2009

Я думаю, что ваше решение не обосновано. Частичные классы обычно должны использоваться только для отделения кода разработчика от кода генератора. Регионы обычно лучше работают над добавлением структуры в ваш код.

1 голос
/ 10 февраля 2009

Если процедура очистки тяжелая, это приемлемо, но не идеально.

Это может быть хорошей привычкой для котельной плиты, такой как незащищенные события, тяжелые методы сериализации и управление памятью в вашем случае.

Я предпочитаю частичные классы, чем контуры (#region). Если вам нужно использовать частичное описание класса или кода, чтобы сделать ваш код читабельным, это обычно является признаком того, что код необходимо изменить. Разорвите приложение класса и только в крайнем случае используйте частичный класс (или регион), если код абсолютно необходим для поддержки этого класса.

В вашем случае вы могли бы использовать класс, который тонко оборачивает неуправляемый ресурс и предоставляет один Dispose. Затем в вашем другом классе используйте управляемый объект и избавьтесь от него без логики.

Если ваш класс - только тонкая оболочка, то я бы сказал, что ваш метод излишний, поскольку весь смысл этого класса - избавиться от неуправляемого ресурса.

0 голосов
/ 17 января 2011

Я бы предпочел использовать частичный класс тогда и только тогда, когда рассматриваемый код был сгенерирован компьютером. Если у вас есть много классов, которые совместно используют похожий код (который по разным причинам нужно повторять, а не извлекать в свой собственный класс), может быть полезно иметь несколько шаблонов и программу для генерации кода на основе таких шаблонов. В этом сценарии шаблоны будут рассматриваться как исходные файлы, а затем генерируемые файлы как промежуточный объектный код. Казалось бы, вполне уместно вытянуть сгенерированный шаблоном код в частичные классы.

В vb.net такой подход может быть полезен для безопасной декларации, инициализации и очистки полей внутри объекта IDisposable. Требуется умеренное количество стандартного кода, но объявления полей после этого довольно чистые. Например:

' Assuming Option Implicit on:
Dim MyThingie = RegDisposable(New DisposableThingie)
' If Implicit wasn't on:
Dim MyThingie As DisposableThingie = RegDisposable(New DisposableThingie)

RegDisposable будет членом класса, который добавит новый DisposableThingie в список, содержащийся в классе. Затем подпрограмма класса Dispose удалит все элементы в списке.

К сожалению, нет чистого способа сделать что-то подобное в C #, так как инициализаторы полей не могут использовать объект, который должен быть создан (в vb.net инициализаторы полей запускаются после создания базового объекта).

0 голосов
/ 21 апреля 2009

Лично я стараюсь сохранить свою логику создания экземпляров / инициализации и логику очистки / утилизации рядом, это хорошее напоминание.

Что касается частичных классов, я использую их только в том случае, если класс очень большой и его можно разделить на группы методов. Сокрытие кода дизайнера тоже замечательно.

0 голосов
/ 10 февраля 2009

Какой-то странный вопрос, поскольку он влияет только на разработчика, полностью отвечая личным предпочтениям. Я могу только сказать вам, что бы я предпочел, и я бы сделал это, если бы значительная часть логики была в части утилизации.

...