質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

968閲覧

階層構造のデータの受け渡しについて

BU_

総合スコア8

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/06/19 15:50

編集2020/06/19 16:24

例えば以下のようなクラスの階層構造があったとします。

フォルダクラス-テキストファイルクラス-行クラス-文字クラス

その上で〇〇フォルダのXXテキストの三行目の二文字目の文字を変えるor追加するとなったとき、どう文字データを渡すのが良いのかで悩んでいます。
フォルダクラスから下の階層に文字データを渡すのは階層ごとにデータを渡すメソッドを作る必要があるのでイマイチかと思ってます。
かと言ってフォルダクラスから文字データクラスを取得して編集するのも同様に階層ごとにメソッドを作る必要があるし、フォルダクラスは文字クラスを知らなくていいのに受け渡す過程で知ってしまい、イマイチな気がします。
このような場合、どう末端にデータを渡すのが良いかアドバイスがあればお聞きしたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BU_

2020/06/19 16:16

そもそも階層化しない方がいいのかなと考えましたが、そうすると文字クラスに フォルダid、テキストファイルid、行index、文字データを持たせることになるのかなと考え、それはそれでテキストファイルが増えるほど管理しづらいかなと思いました。
YAmaGNZ

2020/06/19 23:42

言われているような感じだと、1階層下のクラスを公開するような形になるのではないですかね 下位クラスを使用する側が知らないのであれば、親クラスで書き換えを行うようなメソッド等を作るしかないのではないでしょうか
BU_

2020/06/22 00:28

ご回答ありがとうございます。 そうですよね。やはり下のクラスを公開したくないのであれば、親からそこまでの階層にデータを受け渡すしかないですよね。。
YAmaGNZ

2020/06/22 00:52

ただ、例に挙げられているものだと Text = Folder.Files[0].Lines[0]; みたいな感じでもいいのではないかと感じ、下の階層を非公開にしなくてもいいのではないかと思えてしまいます。 >フォルダid、テキストファイルid、行index、文字データを持たせることになるのかなと考え TreeのNodeみたいな感じで各クラスは自分の親、子を把握していればいいのではないでしょうか?
BU_

2020/06/22 03:59

たしかにそうですね。難しく考えすぎていたようです。
guest

回答2

0

ベストアンサー

私の考えではテキストクラスがユニークの情報を持つべきだと思います。
示してある例だとフォルダ階層+ファイル名(=フルパス)がユニークの情報だと思います。
そしてそのユニークの情報で取り出せるオブジェクトを用意します。

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6 7namespace ConsoleApp3 { 8 class Program { 9 10 public class FolderInfo { 11 12 public FolderInfo(string folderName) { 13 this.Parent = null; 14 this.FolderName = folderName; 15 } 16 public FolderInfo(FolderInfo parent, string folderName) { 17 this.Parent = parent; 18 this.FolderName = folderName; 19 } 20 21 public FolderInfo Parent { set; get; } 22 public string Path => (Parent != null ? Parent.Path + @"\" : "") + FolderName; 23 public string FolderName { set; get; } 24 } 25 26 public class FileInfo { 27 28 public FileInfo(FolderInfo parent, string fileName) { 29 this.Parent = parent; 30 this.FileName = fileName; 31 this.Rows.Add("1行目"); 32 this.Rows.Add("2行目"); 33 this.Rows.Add("3行目"); 34 } 35 36 public FolderInfo Parent { set; get; } 37 public string Path => (Parent != null ? Parent.Path + @"\" : "") + FileName; 38 public string FileName { set; get; } 39 40 public List<string> Rows { get; } = new List<string>(); 41 } 42 43 public static Dictionary<string, FileInfo> Files = new Dictionary<string, FileInfo>(); 44 45 static void Main(string[] args) { 46 47 var folder1 = new FolderInfo("test1"); 48 var folder1_2 = new FolderInfo(folder1, "test2"); 49 var folder1_3 = new FolderInfo(folder1, "test3"); 50 var folder1_2_1 = new FolderInfo(folder1_2, "test3"); 51 52 var file1 = new FileInfo(folder1_2_1, "TextFile1"); 53 var file2 = new FileInfo(folder1_3, "TextFile2"); 54 55 Files.Add(file1.Path, file1); 56 Files.Add(file2.Path, file2); 57 58 Files[@"test1\test2\test3\TextFile1"].Rows[2] = "3行目あいうえお"; 59 } 60 61 } 62} 63

投稿2020/06/22 00:47

dekaaki

総合スコア292

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BU_

2020/06/22 04:03

ご回答ありがとうございます。 FolderInfoクラスでパスを管理、FileInfoクラスをデータの受け渡し口として、それ以下のクラス(行、文字)はテキストクラス内で処理するという感じですね。 たしかにデータ編集ために必要なクラスを決めて、階層構造はパスで管理すれば、階層の深さは問題にならなくなりますね。 具体的なコードを書いてくださったこともあり、ベストアンサーにさせていただきます。 他の皆様もご回答いただきまして、ありがとうございました。
guest

0

フォルダクラスは文字クラスを知らなくていいのに

おそらく一般論にて"必要のないものは公開しない"って原則を気にしているのかと思われます。
原則は原則として気に留めるのは良いですが、目の前にある現実より優先すべきものではありません。

問題は、それらのクラスに対して階層構造を隠蔽する必要があるかどうかです。

それらのクラスにたいして階層構造を隠蔽する必要があるなら、別途管理用のクラスを設けるなどの策が必要です。
階層構造を仕様として共有するなら、それは知るべきものですよね。

投稿2020/06/20 01:39

hihijiji

総合スコア4152

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BU_

2020/06/22 00:30

ご回答ありがとうございます。 原則を変に気にしすぎていたかもしれません。 改めて考えなおしてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問