Си диез / Говнокод #11307 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
if (!File.Exists(filePath))
{
	throw new FileNotFoundException("File is not a file!", filePath);
}

Вот такая вот философия шестилетней давности. Собственное говно :)

Запостил: anmiles anmiles, (Updated )

Комментарии (63) RSS

        • На самом деле это мелкософт мудаки, ведь это они спроектировали такую ситуацию когда существующий по заданному пути, объект File, ВНЕЗАПНО файлом не является. И общего родителя в иерархии с Directory я так понимаю тоже нет.
          Если уж и тырить жабу, то в полном объеме.
          File.java
              /**
               * Tests whether the file or directory denoted by this abstract pathname
               * exists.
               *
               * @return  <code>true</code> if and only if the file or directory denoted
               *          by this abstract pathname exists; <code>false</code> otherwise
               */
              boolean exists() {...
              boolean isDirectory() {...
              boolean isFile() {...
          Ответить
          • это пахнет наследием от IO Handler, что в управляемой написанной с нуля среде вряд ли меет смысл
            почему папка и файл должны иметь общего наследника? Composition over Inheritance же.
            Ответить
            • Кстати, тогда такой вопрос - а перечисление файлов и папок реализовано отдельными функциями в духе Directory.files() и Directory.directories() или же единой функцией, возвращающей и то и то?
              Ответить
              • Отвечу сам-себе - да, отдельные функции GetFiles() и GetDirectories().
                Ответить
            • >почему папка и файл должны иметь общего наследника?
              А вот почему
              Directory.class
              	EnumerateDirectories(String)	
                	EnumerateDirectories(String, String)
                	EnumerateDirectories(String, String, SearchOption)	
                	EnumerateFiles(String)	
                	EnumerateFiles(String, String)	
                	EnumerateFiles(String, String, SearchOption)	
              
              	GetDirectories(String)
                  	GetDirectories(String, String)	
                	GetDirectories(String, String, SearchOption)	
                  	GetFiles(String)	
                  	GetFiles(String, String)
                	GetFiles(String, String, SearchOption)

              Они явно не могут в абстракцию и наследование.
              http://msdn.microsoft.com/en-us/library/system.io.directory.aspx

              >кстати, тогда такой вопрос - а перечисление файлов и папок реализовано отдельными функциями в духе
              Сразу отвечая и на твой вопрос.
              Ответить
          • Стоп. Это же статический метод File.Exists(filePath)! Тут получается, что этот File просто набор статических хелперов, а не сущность, сопоставленная файлу.
            Ответить
            • А я могу сделать
              File myFile = GetFileFromSomewhere();
              return myFile.Exists();
              Ответить
                • Обсуждали тут уже этот вопрос недавно: есть и статические методы, которые получают строки, и объекты File с методом Exists.
                  Ответить
                  • А не FileInfo случаем зовут те объекты? Что-то не могу в мане найти File с не статиками.
                    Ответить
      • И сразу вознимает вопрос: как проверить существует ли папка?
        Ответить
        • Directory.Exists если следовать логике... х.з. я почти не разбирался в c#.
          Ответить
      • Ну как я и думал (по аналогии со старым VB).
        И тогда в этом послании "File is not a file!" вырисовывается некий сакральный смысл.
        Ответить
    • В сишарпе, как и в жабке, с большой буквы разве не классы пишутся, а с маленькой - обьекты?
      Ответить
      • В приведённом говнокоде так и есть. Resharper для Visual Studio даст по жопе, если сделать по-другому.
        Ответить
              • Это ж ещё посмотреть надо, что он класс-утилита. Я вот не пишу на решётке и не знаю. В Java создают объекты класса File.
                Ответить
                  • > В ide - очень долго, да.
                    Поставить вижуалстудию. Очень быстро, да.

                    P.S. Отправлял бы на MSDN тогда уж, ибо до него добраться явно проще, чем до IDE.
                    Ответить
                    • Я имел в виду, что у пишущего на сисярпе вопросов
                      >А объект File же может быть папкой, или не?
                      возникать не должно.
                      Ответить
                      • > у пишущего на сисярпе вопросов возникать не должно.

                        Ну так ни я, ни борманд, ни π на решётке не пишем
                        Ответить
                        • Ну тогда это не говнокод. И теперь буду знать, что сайт окупирован жаваебами.
                          Ответить
                          • Это говнокод, его говняшность заключается в тексте сообщения.
                            //ОП
                            Ответить
                          • >>ни я, ни борманд, ни π на решётке не пишем
                            >Ну тогда это не говнокод
                            Ваша логика безупречна.
                            Ответить
                            • То, что людям, не пишущим на языке, кажется говнокодом, вовсе не обязано им являться?
                              Ответить
  • И тут подмешались симлинки, мягкие, жесткие, дерзкие... и Ява с наследованием осталась не у дел...
    Ответить
    • А c# все было пофиг... Он все равно ничего кроме папок и файлов не видел.
      Ответить
        • Ну и так же сделали, статическими методами.
          А на счет Сишарпа - искать лень, но если уж Виста и более новые поддерживают симлинки, я думаю, они бы чего-нибудь в СДК добавили для их определения. Как жеж программы писать тогда?]

          Ха, нашел быстрее чем думал, через p-invoke... мда...
          http://www.pinvoke.net/default.aspx/kernel32.createsymboliclink
          Ответить
          • Они их сделали глубоко через задницу и с ограниченной поддержкой в интерфейсе. Не стоит 🙂
            Ответить
        • А нам вашей 7-ой жабы не надо.
          У нас есть since 1.2 канонiчные методы.
          public File getCanonicalFile()
                                throws IOException
          /*
          Returns the canonical form of this abstract pathname. 
          Equivalent to new File(this.getCanonicalPath()).
          Returns:
          The canonical pathname string denoting the same file or directory as this abstract pathname
          */
          public String getCanonicalPath()
                                  throws IOException
          /*Returns the canonical pathname string of this abstract pathname.
          A canonical pathname is both absolute and unique.
          The precise definition of canonical form is system-dependent.
          This method first converts this pathname to absolute form if necessary, as if by invoking the getAbsolutePath() method, and then maps it to its unique form in a system-dependent way.
          This typically involves removing redundant names such as "." and ".." from the pathname,
          resolving symbolic links (on UNIX platforms), and converting drive letters to a standard case (on Microsoft Windows platforms).
          */
          Ответить
    • >и Ява с наследованием осталась не у дел...
      Ну почему это? Как раз наследование тут вполне подходит:
      делаем нового наследника от класса File - типа SymLinkFile. И всё.
      Внутри пишем нужную логику, но внешне это тот же File.
      Ответить
        • Ну написано же, выше. Читай по строкам
          >public File getCanonicalFile()
          >Equivalent to new File(this.getCanonicalPath()).
          >The canonical pathname string denoting the same file or directory as this abstract pathname

          Если прочитать другой мой пост http://govnokod.ru/11307#comment144600, то напрашивается ответ:
          new File(this.getCanonicalPath())
          +
          isDirectory()
          =
          file.getCanonicalFile().isDirectory()
          Ответить
          • А как же наследование? в примере выше нет наследования, это то же самое, что foo().bar() нет никакой вообще связи между тем типом, который возвращает foo() и тем типом, который возвращает bar().
            Ответить
            • >>>А как же наследование?
              Объясняю:
              File можно наследовать если хочется
              >делаем нового наследника от класса File - типа SymLinkFile
              и оборачиваем им getCanonicalFile().

              А в C#
              public sealed class FileInfo : FileSystemInfo
              public sealed class DirectoryInfo : FileSystemInfo
              Ответить
              • чет как-то туговато... нет, не получится, если вы будете наследовать от File, то отношение is a Directory в наследника File который не наследуется от Directory в системе разрешаютщей только один супер-класс вы никак не сделаете. То, что вы демонстритуете не имеет отношения, это просто вызов функции которая возвращает объект нужного типа. С наследованием это не связано.
                Ответить
                • Я очевидно говорю о другом:
                  Если хочется то в яве _можно_ сделать наследника от File.
                  И тогда new SymLinkFile(path) будет прозрачно отсылать нас к файлу или папке вместо path, который является ссылкой. Внешне же это будет наш File.

                  >То, что вы демонстритуете не имеет отношения
                  Это я указываю способ на то как это можно осуществить.
                  Ответить
                  • Ну так смысл был в том, что осуществить именно через наследование не получится, а то что вообще можно, ну так нужно очень сильно постараться, чтобы вообще никак нельзя было.
                    Ответить
                    • Я не совсем понял этот пост.
                      Вот еще раз, повторюсь
                      >public sealed class FileInfo : FileSystemInfo
                      Ответить
                      • Так это как бы вообще С#, ну да не важно в данном случае.
                        Есть цепочка наследования:
                        Directory <- File
                        Пытаемся добавить симлинк:
                        SymLink <- File
                        Теперь SymLink не может быть Directory потому, что уже наследует File.
                        Исправляем:
                        SymLink <- Directory <- File
                        но, естественно, не все симлинки являются директориями.
                        Исправляем:
                        SymLinkDirectory <- SymLink <- AbstractFile
                        Directory <- File <- AbstracFile
                        Все равно, типы SymLinkDirectory и Directory не совместимы.
                        и т.д.
                        Т.е. нету и в принципе не может быть ситуации в системе не поддерживающей множественное наследование, где возможно реализовать отношение между файлами директориями и симлинками, которое наблюдается в жизни.
                        А то, что это можно сделать кучей других способов - как бы и так понятно.
                        Ответить
                        • >Так это как бы вообще С#
                          А что в ОП посте?
                          А о чем мы вообще говорили изначально?
                          >ну да не важно в данном случае.
                          Очень важно. Речь шла о нем.

                          >в системе не поддерживающей множественное наследование
                          Может. Интерфейсы вы еще не проходили.
                          К тому же я привел пример.
                          Ответить
                          • > И тут подмешались симлинки, мягкие, жесткие, дерзкие... и Ява с наследованием осталась не у дел...

                            Мой пост про Яву и Наследование. Про C# и наследование я не говорил.
                            Интерфейсы - не наследование. Интерфейсы, это другой способ решить задачу.
                            Ответить
                            • >Но это конечно замечательно, потому что - нет объяснения, просто так, потому что думать не хочется.

                              Не хочется думать и внимательно читать чужие посты.

                              >Мой пост про Яву и Наследование.
                              Я привел пример на Яве и Наследованием. И даже _без интерфейсов_

                              >SymLink <- Directory <- File
                              Бгг 😀
                              Гениальная находка в области проектирования - наследовать симлинк от папки.
                              >не все симлинки являются директориями.
                              Симлинки ВООБЩЕ не являются директориями.
                              Ответить
                              • > Я привел пример на Яве и Наследованием. И даже _без интерфейсов_
                                И без наследования, просто с вызовом какого-то метода - таких способов миллион, речь про наследование, а не про то как можно решить проблему без него.

                                Симлинки могут указывать на директории, этого достаточно для того, чтобы расценивать их как директории, для того такая возможность и существует. Если вас это чем-то не устраивает - то, например, разработчиков графического интерфейса всяких проводников по файловой системе такой подход вполне устраивал. Он так же устраивает другие языки (тот же bash и eLisp, например):
                                [ -h ./some-symlink ] && echo "is a symlink"
                                [ -d ./some-symlink ] && echo "is a symlink and a directory"
                                Ответить
                        • SymLink не может быть Directory, он может лишь указывать на каталог, но не содержать другие файлы. Даже если symlink указывает на каталог, объекты SymLink нужны будут не для того, чтобы перебирать файлы (для этого нам вполне подойдёт обычный Directory, прозрачный по отношению к символическим ссылкам), а для того, чтобы находить реальный путь и выполнять другие операции, специфические именно для символических ссылок.

                          Потому SymLink <: File очень даже подходит. В конце концов, symlink - это просто файл, в котором хранится путь + флажок в inode.
                          Ответить
                          • Как вы проблему решите по-другому - не интерсно. Эту проблему можно решить множеством разных способов. Я вам говорю, что "не можете решить эту проблему с помощью наследования", а вы мне отвечаете: нет, я ее решу лопаткой в песочнице! Нет я ее решу мелом на заборе! И т.д. вы хоть прочитайте одну единственную фразу с которой не соглашаетесь.

                            Следуя вашему описаний симлинка - директория - тоже файл, и тут мы возвращаемся к проблеме типов, что и директория - файл и симлинк файл, но бывают симлинки, которые нужно расценивать как директории, а бывают такие, что нет - и тут наследование не помогает, потому что кто-то решил, что множественное наследование "не нужно" и придумал множество обходных путей как бороться с отсутсвием множественного наследования. Но это конечно замечательно, потому что - нет объяснения, просто так, потому что думать не хочется.
                            Ответить
    • А вот мелкософту с его статикой придется добавить новый набор методов:
      GetSymLinks(String)	
      GetSymLinks(String, String)
      GetSymLinks(String, String, SearchOption)

      к уже существующим:
      http://govnokod.ru/11307#comment144618
      Ответить

Добавить комментарий

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8