netlib.narod.ru< Назад | Оглавление | Далее >

Класс StringHelper

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

Взглянув на класс StringHelper (рис. 3.9) вы немедленно увидите множество методов и то, что все методы перегружены, поддерживая много различных типов параметров. Класс также содержит довольно много тестов модулей; несколько минут назад вы уже видели тест модуля из класса StringHelper.


Рис. 3.9

Рис. 3.9


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

Извлечение имен файлов

Методы GetDirectory, CutExtension и подобные также доступны в классе Path из пространства имен System.IO, но один из наиболее полезных методов для имен файлов в StringHelper — это метод ExtractFilename, который обрезает и путь и расширение, чтобы получить имя файла и ничего более.

Аналогичную вещь делает Path.GetFileNameWithoutExtension, но по ряду причин я считаю свой метод лучшим. Он может также быть интересным, если вы хотите реализовать свои собственные методы и нуждаетесь в каком-нибудь рабочем коде, который послужит отправной точкой. И снова: вы не обязаны писать собственные версии реализованных в Path методов, но иногда вы можете не знать, что предлагает платформа, либо хотите провести собственное исследование.

Прошло много времени с тех пор, как я проверял производительность этих методов, но я все еще предполагаю, что большинство методов из StringHelper быстрее, чем методы из Path.

/// <summary>
/// Извлекает имя файла из полной строки путь+имя файла,
/// обрезая расширение, если cutExtension равно true.
/// Может также использоваться для вырезания каталогов из пути
/// (остается только один последний). 
/// </summary>
static public string ExtractFilename(string pathFile, bool cutExtension)
{
  if (pathFile == null)
    return "";

  // Поддержка слэшей windows и unix
  string[] fileName = pathFile.Split(new char[] { '\\', '/' });
  if (fileName.Length == 0)
  {
    if (cutExtension)
      return CutExtension(pathFile);
    return pathFile;
  } // if (fileName.Length)

  if (cutExtension)
    return CutExtension(fileName[fileName.Length - 1]);
  return fileName[fileName.Length - 1];
} // ExtractFilename(pathFile, cutExtension)

Написать тест модуля для подобного метода очень легко. Просто проверьте, что возвращается ожидаемый результат:

Assert.AreEqual("SomeFile",
      StringHelper.ExtractFilename("SomeDir\\SomeFile.bmp"));

Написание списков

Более уникален метод WriteArrayData класса StringHelper, который записывает любые типы списков, массивов или данных, реализующих интерфейс IEnumerable, в текстовую строку, которую затем можно использовать для журналирования. Реализация снова весьма проста:

/// <summary>
/// Возвращает строку с данными массива, версия ArrayList.
/// </summary>
static public string WriteArrayData(ArrayList array)
{
  StringBuilder ret = new StringBuilder();
  if (array != null)
    foreach (object obj in array)
      ret.Append((ret.Length == 0 ? "" : ", ") +
        obj.ToString());
  return ret.ToString();
} // WriteArrayData(array)

Списки, даже обобщенные, наследуются от класса ArrayList, поэтому вы можете вызывать этот метод с любым динамическим списком. Для массивов существует специальная перегрузка, а также для специальных коллекций и массивов байтов или целых чисел; хотя они работали бы и с IEnumerable, быстрее использовать перегрузки, которые не используют класс объекта.

Для тестирования метода WriteArrayData вы можете написать метод, подобный следующему:

/// <summary>
/// Тестирование WriteArrayData
/// </summary>
[Test]
public void TestWriteArrayData()
{
  Assert.AreEqual("3, 5, 10",
    WriteArrayData(new int[] { 3, 5, 10 }));
  Assert.AreEqual("one, after, another",
    WriteArrayData(new string[] { "one", "after", "another" }));
  List<string> genericList = new List<string>();
    genericList.Add("whats");
    genericList.AddRange(new string[] { "going", "on" });
  Assert.AreEqual("whats, going, on",
    WriteArrayData(genericList));
} // TestWriteArray()

netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz