Movatterモバイル変換


[0]ホーム

URL:


はてラボはてな匿名ダイアリー
ようこそ ゲスト さんログインユーザー登録
< anond:20240817215053 |anond:20240817215653 >

2024-08-17

anond:20240817015407

依存関係は木で表現

ノードロック持たせる

ロックに条件持たせる

やりたいことはできてるように見えるが、うーんしんどい

# Entity Relation Diagram
# ```mermaid
# ---
#title: Rental Office example
# ---
# erDiagram
# OFFICE ||--|{ ROOM : x
# OFFICE {
#number office_id
# }
# ROOM {
#number office_id
#number room_id
# }
# ROOM ||--|{ SCHEDULE : x
# SCHEDULE {
#number room_id
# datetime start_at
# datetime end_at
# }
# OFFICE ||--|{ BUSINESS_HOUR : x
# BUSINESS_HOUR {
#number office_id
#enum week_of_day
# datetime start_at
# datetime end_at
# }
# ```

# Directed Acyclic Graph
#
# ```mermaid
# graph LR
# A[OFFICE] --> B[ROOM]
# B --> C[SCHEDULE]
# A[OFFICE] --> D[BUSINESS_HOUR]
# D --> C
# A --> C
# ```


# 基底クラス: EntityLock
class EntityLock
attr_accessor :entity_name, :entity_locked, :attribute_locks

def initialize(entity_name)
@entity_name = entity_name
@entity_locked =false #エンティティ全体のロック状態を保持
@attribute_locks = {} #IDに対するロック管理するハッシュ
end

def lock_entity
@entity_locked =true
puts "Entity '#{@entity_name}'isnow locked."
end

def unlock_entity
@entity_locked =false
puts "Entity '#{@entity_name}'isnowunlocked."
end

def lock(attributes)
entity_id = attributes["#{@entity_name.downcase}_id"]
if entity_id &amp;&amp; !@attribute_locks[entity_id]
@attribute_locks[entity_id] =true
puts "#{@entity_name} withID '#{entity_id}'isnow locked."
end
end

def unlock(attributes)
entity_id = attributes["#{@entity_name.downcase}_id"]
if entity_id &amp;&amp; @attribute_locks[entity_id]
@attribute_locks.delete(entity_id)
puts "#{@entity_name} withID '#{entity_id}'isnowunlocked."
end
end

def locked?(attributes)
# まずエンティティ全体がロックされているかチェック
returntrue if @entity_locked

# 次に特定IDロックされているかチェック
entity_id = attributes["#{@entity_name.downcase}_id"]
if entity_id &amp;&amp; @attribute_locks[entity_id]
returntrue
end

#ロックされていなければfalseを返す
false
end
end

# 子クラス: OfficeLock, RoomLock, ScheduleLock
class OfficeLock < EntityLock
def initialize
super("Office")
end
end

class RoomLock < EntityLock
def initialize
super("Room")
end
end

class ScheduleLock < EntityLock
def initialize
super("Schedule")
end
end

# 子クラス: BusinessHourLock
class BusinessHourLock < EntityLock
def initialize
super("BusinessHour")
@attribute_locks = [] # BusinessHour用のロック配列管理
end

def lock(attributes)
start_at = attributes["start_at"]
end_at = attributes["end_at"]
if start_at &amp;&amp; end_at
@attribute_locks << [start_at, end_at]
puts "BusinessHour from '#{start_at}' to '#{end_at}'isnow locked."
end
end

def unlock(attributes)
start_at = attributes["start_at"]
end_at = attributes["end_at"]
if @attribute_locks.include?([start_at, end_at])
@attribute_locks.delete([start_at, end_at])
puts "BusinessHour from '#{start_at}' to '#{end_at}'isnowunlocked."
end
end

def locked?(attributes)
# まずエンティティ全体がロックされているかチェック
returntrue if @entity_locked

# 次に特定時間範囲ロックされているかチェック
start_at = attributes["start_at"]
end_at = attributes["end_at"]
if start_at &amp;&amp; end_at
@attribute_locks.each do |(locked_start, locked_end)|
if locked_start <= start_at &amp;&amp; end_at <= locked_end
returntrue
end
end
end

#ロックされていなければfalseを返す
false
end
end

# TreeNodeクラス
class TreeNode
attr_accessor :name, :children, :parents, :lock

def initialize(name, lock)
@name =name
@children = []
@parents = [] #複数の親ノードを保持する配列
@lock = lock # TreeNodeにロックを持たせる
end

def add_child(child_node)
child_node.parents << self # 子ノードにこのノードを親として追加
@children << child_node
end

def display(level = 0)
indent = " " * (level * 4)
puts "#{indent}#{@name}"
@children.each { |child| child.display(level + 1) }
end

def has_dependency
returnfalse if @parents.empty?

@parents.each do |parent|
puts "#{@name}is dependenton #{parent.name}"
returntrue
end

@parents.any?(&amp;:has_dependency)
end

def locked?(attributes = {})
#自身ロックされているか確認
returntrue if @lock.locked?(attributes)

# 親ノードロックされているか再帰的に確認
@parents.any? { |parent| parent.locked?(attributes) }
end
end

#木構造の組み立て

#ロックオブジェクト作成
office_lock = OfficeLock.new
room_lock = RoomLock.new
schedule_lock = ScheduleLock.new
business_hour_lock = BusinessHourLock.new

#ノード作成
office_node = TreeNode.new("Office", office_lock)
room_node = TreeNode.new("Room", room_lock)
schedule_node = TreeNode.new("Schedule", schedule_lock)
business_hour_node = TreeNode.new("BusinessHour", business_hour_lock)

#ノード間の依存関係の設定
office_node.add_child(room_node) # Office -> Room
room_node.add_child(schedule_node) # Room -> Schedule
office_node.add_child(business_hour_node) # Office -> BusinessHour
business_hour_node.add_child(schedule_node) # BusinessHour -> Schedule

#木構造の表示
office_node.display

#ロック確認
puts "Case 1. Office全体がロックされた場合"
puts "Is office_node locked? #{office_node.locked?({})}" #false
puts "Is schedule_node locked? #{schedule_node.locked?({})}" #false
office_lock.lock_entity
puts "Is office_node locked? #{office_node.locked?({})}" #true
puts "Is schedule_node locked? #{schedule_node.locked?({})}" #true
office_lock.unlock_entity

puts "Case 2. Roomid:1 がロックされた場合"
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 1 })}" #false
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 2 })}" #false
room_lock.lock({ "room_id" => 1 })
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 1 })}" #true
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 2 })}" #false
room_lock.unlock({ "room_id" => 1 })

puts "Case 3. BusinessHour start_at:0 end_at:5 がロックされた場合"
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 1, "start_at" => 0, "end_at" => 5 })}" #false
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 1, "start_at" => 5, "end_at" =>10 })}" #false
business_hour_lock.lock({ "start_at" => 0, "end_at" => 5 })
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 1, "start_at" => 0, "end_at" => 5 })}" #true
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 1, "start_at" => 5, "end_at" =>10 })}" #false
business_hour_lock.unlock({ "start_at" => 0, "end_at" => 5 })

Permalink |記事への反応(1) | 22:00

このエントリーをはてなブックマークに追加ツイートシェア

記事への反応 -
  • 例えば貸しオフィスの例で表現すると ER図がこんな感じ https://mermaid.live/edit#pako:eNqNUsFuwyAM_RXkc_sDHNemaqVtkRrlhoRYMC1agYmC1irJv5c0UbJqqTb7AH7P2A9MDZWTCBSY7Rz9WouDF4ZZkizfbHarjDTNctnUZJ_nb4SSywNX91FnNpoP9MQppSvkWvZM2y_3w...

    • 高さ3の有向木で根からAという節点が生えAからBという葉が生える class TreeNode: def __init__(self, name, attributes=None): self.name = name self.attributes = attributes or {} self.children = [] d...

      • うーむ?やっぱ木じゃOFFICE、ROOM、SCHEDULE、BUSINESS_HOURの4つは表現できないかー

        • で・・・できたけど木の組み立てがしんどすぎるー class TreeNode: def __init__(self, name, attributes=None): self.name = name self.attributes = attributes or {} self.children = [] def add_child(self, chi...

          • あー依存関係は木で表現して、条件はattributesとして持たせればいいのか あしたやるぞー!

            • 依存関係は木で表現 ノードにロック持たせる ロックに条件持たせる やりたいことはできてるように見えるが、うーんしんどい # Entity Relation Diagram# ```mermaid# ---# title: Rental Office example# -...

              • そんでこのロックのデータをこんなかんじでRedisにもてばネットワーク越しに依存関係のあるロックできる? Type キー名 値 String "Office1" true String "Office2" false Stri...

記事への反応(ブックマークコメント)

全てのコメントを見る

人気エントリ

注目エントリ

ログインユーザー登録
ようこそ ゲスト さん
Copyright (C) 2001-2025 hatena. All Rights Reserved.

[8]ページ先頭

©2009-2025 Movatter.jp